Changes in / [1148:2126945deb6a:1149:3ec484b11733] in lemon-main
- Files:
-
- 3 added
- 33 edited
Legend:
- Unmodified
- Added
- Removed
-
CMakeLists.txt
r1137 r1138 4 4 CMAKE_POLICY(SET CMP0048 OLD) 5 5 ENDIF(POLICY CMP0048) 6 7 IF(POLICY CMP0043) 8 CMAKE_POLICY(SET CMP0043 OLD) 9 ENDIF(POLICY CMP0043) 6 10 7 11 IF(POLICY CMP0026) … … 235 239 FORCE ) 236 240 241 SET_DIRECTORY_PROPERTIES(PROPERTIES 242 COMPILE_DEFINITIONS_DEBUG "LEMON_ENABLE_DEBUG" 243 COMPILE_DEFINITIONS_MAINTAINER "LEMON_ENABLE_DEBUG" 244 ) 237 245 238 246 INCLUDE(CheckTypeSize) … … 263 271 264 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 265 281 266 282 IF(${CMAKE_BUILD_TYPE} STREQUAL "Maintainer") -
doc/Doxyfile.in
r1075 r1145 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
r1093 r1142 562 562 563 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\f$. 589 590 */ 591 592 /** 564 593 @defgroup planar Planar Embedding and Drawing 565 594 @ingroup algs -
doc/named-param.dox
r440 r1142 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
r1051 r1142 355 355 pages = {587--612} 356 356 } 357 358 @article{cordella2004sub, 359 title = {A (sub) graph isomorphism algorithm for matching 360 large graphs}, 361 author = {Cordella, Luigi P and Foggia, Pasquale and Sansone, 362 Carlo and Vento, Mario}, 363 journal = {Pattern Analysis and Machine Intelligence, IEEE 364 Transactions on}, 365 volume = 26, 366 number = 10, 367 pages = {1367--1372}, 368 year = 2004, 369 publisher = {IEEE} 370 } -
lemon/bellman_ford.h
r1092 r1131 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
r1092 r1131 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
r1092 r1131 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
r1092 r1130 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
r1092 r1132 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/cbc.cc
r1092 r1130 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
r1092 r1130 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
r1092 r1130 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
r1092 r1130 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
r1093 r1130 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 … … 327 389 ArcIt& operator++() { return *this; } 328 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 329 412 330 413 /// \brief The source node of the arc. -
lemon/concepts/graph.h
r1093 r1130 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 … … 411 474 ArcIt& operator++() { return *this; } 412 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 413 497 414 498 /// Iterator class for the outgoing arcs of a node. … … 460 544 }; 461 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 462 567 /// Iterator class for the incoming arcs of a node. 463 568 … … 507 612 InArcIt& operator++() { return *this; } 508 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 } 509 634 510 635 /// \brief Standard graph map type for the nodes. -
lemon/concepts/path.h
r1092 r1130 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
r1134 r1136 4 4 #define LEMON_VERSION "@PROJECT_VERSION@" 5 5 #cmakedefine LEMON_HAVE_LONG_LONG 1 6 7 #cmakedefine LEMON_CXX11 1 6 8 7 9 #cmakedefine LEMON_WIN32 1 -
lemon/cplex.cc
r1139 r1140 105 105 int status; 106 106 _prob = CPXcloneprob(cplexEnv(), cplex._prob, &status); 107 rows = cplex.rows;108 cols = cplex.cols;107 _rows = cplex._rows; 108 _cols = cplex._cols; 109 109 messageLevel(MESSAGE_NOTHING); 110 110 } … … 133 133 ExprIterator e, Value ub) { 134 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 135 146 if (lb == -INF) { 136 147 const char s = 'L'; 137 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); 138 150 } else if (ub == INF) { 139 151 const char s = 'G'; 140 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); 141 154 } else if (lb == ub){ 142 155 const char s = 'E'; 143 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); 144 158 } else { 145 159 const char s = 'R'; 146 160 double len = ub - lb; 147 CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, &len, 0); 148 } 149 150 std::vector<int> indices; 151 std::vector<int> rowlist; 152 std::vector<Value> values; 153 154 for(ExprIterator it=b; it!=e; ++it) { 155 indices.push_back(it->first); 156 values.push_back(it->second); 157 rowlist.push_back(i); 158 } 159 160 CPXchgcoeflist(cplexEnv(), _prob, values.size(), 161 &rowlist.front(), &indices.front(), &values.front()); 162 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 163 166 return i; 164 167 } … … 173 176 174 177 void CplexBase::_eraseColId(int i) { 175 cols.eraseIndex(i);176 cols.shiftIndices(i);178 _cols.eraseIndex(i); 179 _cols.shiftIndices(i); 177 180 } 178 181 void CplexBase::_eraseRowId(int i) { 179 rows.eraseIndex(i);180 rows.shiftIndices(i);182 _rows.eraseIndex(i); 183 _rows.shiftIndices(i); 181 184 } 182 185 -
lemon/glpk.cc
r1092 r1130 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
r1092 r1130 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/list_graph.h
r1148 r1149 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 … … 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 … … 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 -
lemon/lp_base.h
r1092 r1144 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
r1092 r1130 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/path.h
r1092 r1130 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/random.h
r1134 r1136 252 252 current = state + length; 253 253 254 registerWord *curr = state + length - 1;255 registerlong num;254 Word *curr = state + length - 1; 255 long num; 256 256 257 257 num = length - shift; -
lemon/smart_graph.h
r1092 r1130 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
r1092 r1130 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 } -
test/CMakeLists.txt
r1088 r1141 55 55 tsp_test 56 56 unionfind_test 57 vf2_test 57 58 ) 58 59 -
test/bellman_ford_test.cc
r1092 r1131 102 102 103 103 for (BF::ActiveIt it(const_bf_test); it != INVALID; ++it) {} 104 for (auto n: const_bf_test.activeNodes()) { ::lemon::ignore_unused_variable_warning(n); } 105 for (Digraph::Node n: const_bf_test.activeNodes()) { 106 ::lemon::ignore_unused_variable_warning(n); 107 } 104 108 } 105 109 { -
test/graph_test.h
r1092 r1131 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
r1105 r1131 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 … … 48 48 int count=0; 49 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 50 55 return count; 51 56 } … … 54 59 int count=0; 55 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 56 66 return count; 57 67 } -
test/maps_test.cc
r1092 r1131 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 }
Note: See TracChangeset
for help on using the changeset viewer.