Changeset 209:765619b7cbb2 in lemon-main
- Timestamp:
- 07/13/08 20:51:02 (16 years ago)
- Branch:
- default
- Phase:
- public
- Files:
-
- 80 edited
Legend:
- Unmodified
- Added
- Removed
-
demo/arg_parser_demo.cc
r204 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 65 65 ap.other("infile", "The input file.") 66 66 .other("..."); 67 67 68 68 // Perform the parsing process 69 69 // (in case of any error it terminates the program) … … 85 85 if(ap.given("grb")) std::cout << " -grb is given\n"; 86 86 if(ap.given("grc")) std::cout << " -grc is given\n"; 87 87 88 88 switch(ap.files().size()) { 89 89 case 0: … … 95 95 default: 96 96 std::cout << " " 97 97 << ap.files().size() << " file arguments were given. They are:\n"; 98 98 } 99 99 for(unsigned int i=0;i<ap.files().size();++i) 100 100 std::cout << " '" << ap.files()[i] << "'\n"; 101 101 102 102 return 0; 103 103 } -
demo/graph_to_eps_demo.cc
r206 r209 1 /* -*- C++-*-2 * 3 * This file is a part of LEMON, a generic C++ optimization library 1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 * 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 50 50 typedef ListDigraph::Arc Arc; 51 51 typedef dim2::Point<int> Point; 52 52 53 53 Node n1=g.addNode(); 54 54 Node n2=g.addNode(); … … 63 63 ListDigraph::ArcMap<int> acolors(g); 64 64 ListDigraph::ArcMap<int> widths(g); 65 65 66 66 coords[n1]=Point(50,50); sizes[n1]=1; colors[n1]=1; shapes[n1]=0; 67 67 coords[n2]=Point(50,70); sizes[n2]=2; colors[n2]=2; shapes[n2]=2; … … 69 69 coords[n4]=Point(70,50); sizes[n4]=2; colors[n4]=4; shapes[n4]=1; 70 70 coords[n5]=Point(85,60); sizes[n5]=3; colors[n5]=5; shapes[n5]=2; 71 71 72 72 Arc a; 73 73 … … 79 79 a=g.addArc(n2,n4); acolors[a]=1; widths[a]=2; 80 80 a=g.addArc(n3,n4); acolors[a]=2; widths[a]=1; 81 81 82 82 IdMap<ListDigraph,Node> id(g); 83 83 … … 183 183 ListDigraph::NodeMap<int> hcolors(h); 184 184 ListDigraph::NodeMap<Point> hcoords(h); 185 185 186 186 int cols=int(sqrt(double(palette.size()))); 187 187 for(int i=0;i<int(paletteW.size());i++) { … … 190 190 hcolors[n]=i; 191 191 } 192 192 193 193 cout << "Create 'graph_to_eps_demo_out_6_colors.eps'" << endl; 194 194 graphToEps(h,"graph_to_eps_demo_out_6_colors.eps"). … … 203 203 nodeColors(composeMap(paletteW,hcolors)). 204 204 run(); 205 205 206 206 return 0; 207 207 } -
demo/lgf_demo.cc
r193 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 22 22 /// 23 23 /// This program gives an example of how to read and write a digraph 24 /// and additional maps from/to a stream or a file using the 24 /// and additional maps from/to a stream or a file using the 25 25 /// \ref lgf-format "LGF" format. 26 26 /// … … 43 43 SmartDigraph::ArcMap<int> cap(g); 44 44 SmartDigraph::Node s, t; 45 45 46 46 try { 47 47 digraphReader("digraph.lgf", g). // read the directed graph into g -
doc/coding_style.dox
r41 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 19 19 /*! 20 20 21 \page coding_style LEMON Coding Style 21 \page coding_style LEMON Coding Style 22 22 23 23 \section naming_conv Naming Conventions … … 69 69 70 70 \code 71 AllWordsCapitalizedWithoutUnderscores 71 AllWordsCapitalizedWithoutUnderscores 72 72 \endcode 73 73 … … 77 77 78 78 \code 79 firstWordLowerCaseRestCapitalizedWithoutUnderscores 79 firstWordLowerCaseRestCapitalizedWithoutUnderscores 80 80 \endcode 81 81 … … 85 85 86 86 \code 87 ALL_UPPER_CASE_WITH_UNDERSCORES 87 ALL_UPPER_CASE_WITH_UNDERSCORES 88 88 \endcode 89 89 90 \subsection cs-loc-var Class and instance member variables, auto variables 90 \subsection cs-loc-var Class and instance member variables, auto variables 91 91 92 92 The names of class and instance member variables and auto variables (=variables used locally in methods) should look like the following. 93 93 94 94 \code 95 all_lower_case_with_underscores 95 all_lower_case_with_underscores 96 96 \endcode 97 97 -
doc/dirs.dox
r40 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 75 75 76 76 This directory contains some helper classes to implement graphs, maps and 77 some other classes. As a user you typically don't have to deal with these 77 some other classes. As a user you typically don't have to deal with these 78 78 files. 79 79 */ -
doc/groups.dox
r192 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 27 27 \brief Graph structures implemented in LEMON. 28 28 29 The implementation of combinatorial algorithms heavily relies on 30 efficient graph implementations. LEMON offers data structures which are 31 planned to be easily used in an experimental phase of implementation studies, 32 and thereafter the program code can be made efficient by small modifications. 29 The implementation of combinatorial algorithms heavily relies on 30 efficient graph implementations. LEMON offers data structures which are 31 planned to be easily used in an experimental phase of implementation studies, 32 and thereafter the program code can be made efficient by small modifications. 33 33 34 34 The most efficient implementation of diverse applications require the … … 41 41 some graph features like arc/edge or node deletion. 42 42 43 Alteration of standard containers need a very limited number of 44 operations, these together satisfy the everyday requirements. 45 In the case of graph structures, different operations are needed which do 46 not alter the physical graph, but gives another view. If some nodes or 43 Alteration of standard containers need a very limited number of 44 operations, these together satisfy the everyday requirements. 45 In the case of graph structures, different operations are needed which do 46 not alter the physical graph, but gives another view. If some nodes or 47 47 arcs have to be hidden or the reverse oriented graph have to be used, then 48 this is the case. It also may happen that in a flow implementation 49 the residual graph can be accessed by another algorithm, or a node-set 50 is to be shrunk for another algorithm. 51 LEMON also provides a variety of graphs for these requirements called 52 \ref graph_adaptors "graph adaptors". Adaptors cannot be used alone but only 53 in conjunction with other graph representations. 48 this is the case. It also may happen that in a flow implementation 49 the residual graph can be accessed by another algorithm, or a node-set 50 is to be shrunk for another algorithm. 51 LEMON also provides a variety of graphs for these requirements called 52 \ref graph_adaptors "graph adaptors". Adaptors cannot be used alone but only 53 in conjunction with other graph representations. 54 54 55 55 You are free to use the graph structure that fit your requirements 56 56 the best, most graph algorithms and auxiliary data structures can be used 57 with any graph structures. 57 with any graph structures. 58 58 */ 59 59 … … 64 64 65 65 This group describes some graph types between real graphs and graph adaptors. 66 These classes wrap graphs to give new functionality as the adaptors do it. 66 These classes wrap graphs to give new functionality as the adaptors do it. 67 67 On the other hand they are not light-weight structures as the adaptors. 68 68 */ 69 69 70 70 /** 71 @defgroup maps Maps 71 @defgroup maps Maps 72 72 @ingroup datas 73 73 \brief Map structures implemented in LEMON. … … 80 80 81 81 /** 82 @defgroup graph_maps Graph Maps 82 @defgroup graph_maps Graph Maps 83 83 @ingroup maps 84 84 \brief Special graph-related maps. … … 116 116 } 117 117 } 118 118 119 119 Digraph::NodeMap<int> degree_map(graph); 120 120 121 121 digraphToEps(graph, "graph.eps") 122 122 .coords(coords).scaleToA4().undirected() 123 123 .nodeColors(composeMap(functorToMap(nodeColor), degree_map)) 124 124 .run(); 125 \endcode 125 \endcode 126 126 The \c functorToMap() function makes an \c int to \c Color map from the 127 127 \e nodeColor() function. The \c composeMap() compose the \e degree_map … … 141 141 typedef DivMap<DoubleArcMap, DoubleArcMap> TimeMap; 142 142 TimeMap time(length, speed); 143 143 144 144 Dijkstra<Digraph, TimeMap> dijkstra(graph, time); 145 145 dijkstra.run(source, target); … … 153 153 154 154 /** 155 @defgroup matrices Matrices 155 @defgroup matrices Matrices 156 156 @ingroup datas 157 157 \brief Two dimensional data storages implemented in LEMON. … … 201 201 \brief Common graph search algorithms. 202 202 203 This group describes the common graph search algorithms like 203 This group describes the common graph search algorithms like 204 204 Breadth-first search (Bfs) and Depth-first search (Dfs). 205 205 */ … … 213 213 */ 214 214 215 /** 216 @defgroup max_flow Maximum Flow algorithms 217 @ingroup algs 215 /** 216 @defgroup max_flow Maximum Flow algorithms 217 @ingroup algs 218 218 \brief Algorithms for finding maximum flows. 219 219 … … 232 232 233 233 LEMON contains several algorithms for solving maximum flow problems: 234 - \ref lemon::EdmondsKarp "Edmonds-Karp" 234 - \ref lemon::EdmondsKarp "Edmonds-Karp" 235 235 - \ref lemon::Preflow "Goldberg's Preflow algorithm" 236 236 - \ref lemon::DinitzSleatorTarjan "Dinitz's blocking flow algorithm with dynamic trees" … … 251 251 252 252 This group describes the algorithms for finding minimum cost flows and 253 circulations. 254 */ 255 256 /** 257 @defgroup min_cut Minimum Cut algorithms 258 @ingroup algs 253 circulations. 254 */ 255 256 /** 257 @defgroup min_cut Minimum Cut algorithms 258 @ingroup algs 259 259 260 260 \brief Algorithms for finding minimum cut in graphs. … … 273 273 274 274 - \ref lemon::HaoOrlin "Hao-Orlin algorithm" to calculate minimum cut 275 in directed graphs 275 in directed graphs 276 276 - \ref lemon::NagamochiIbaraki "Nagamochi-Ibaraki algorithm" to 277 277 calculate minimum cut in undirected graphs … … 308 308 309 309 /** 310 @defgroup matching Matching algorithms 310 @defgroup matching Matching algorithms 311 311 @ingroup algs 312 312 \brief Algorithms for finding matchings in graphs and bipartite graphs. … … 315 315 matchings in graphs and bipartite graphs. The general matching problem is 316 316 finding a subset of the arcs which does not shares common endpoints. 317 317 318 318 There are several different algorithms for calculate matchings in 319 319 graphs. The matching problems in bipartite graphs are generally … … 324 324 325 325 Lemon contains the next algorithms: 326 - \ref lemon::MaxBipartiteMatching "MaxBipartiteMatching" Hopcroft-Karp 327 augmenting path algorithm for calculate maximum cardinality matching in 326 - \ref lemon::MaxBipartiteMatching "MaxBipartiteMatching" Hopcroft-Karp 327 augmenting path algorithm for calculate maximum cardinality matching in 328 328 bipartite graphs 329 - \ref lemon::PrBipartiteMatching "PrBipartiteMatching" Push-Relabel 330 algorithm for calculate maximum cardinality matching in bipartite graphs 331 - \ref lemon::MaxWeightedBipartiteMatching "MaxWeightedBipartiteMatching" 332 Successive shortest path algorithm for calculate maximum weighted matching 329 - \ref lemon::PrBipartiteMatching "PrBipartiteMatching" Push-Relabel 330 algorithm for calculate maximum cardinality matching in bipartite graphs 331 - \ref lemon::MaxWeightedBipartiteMatching "MaxWeightedBipartiteMatching" 332 Successive shortest path algorithm for calculate maximum weighted matching 333 333 and maximum weighted bipartite matching in bipartite graph 334 - \ref lemon::MinCostMaxBipartiteMatching "MinCostMaxBipartiteMatching" 335 Successive shortest path algorithm for calculate minimum cost maximum 334 - \ref lemon::MinCostMaxBipartiteMatching "MinCostMaxBipartiteMatching" 335 Successive shortest path algorithm for calculate minimum cost maximum 336 336 matching in bipartite graph 337 337 - \ref lemon::MaxMatching "MaxMatching" Edmond's blossom shrinking algorithm … … 397 397 */ 398 398 399 /** 400 @defgroup lp_utils Tools for Lp and Mip solvers 399 /** 400 @defgroup lp_utils Tools for Lp and Mip solvers 401 401 @ingroup lp_group 402 402 \brief Helper tools to the Lp and Mip solvers. … … 415 415 416 416 /** 417 @defgroup utils Tools and Utilities 417 @defgroup utils Tools and Utilities 418 418 \brief Tools and utilities for programming in LEMON 419 419 … … 468 468 \brief Graph Input-Output methods 469 469 470 This group describes the tools for importing and exporting graphs 470 This group describes the tools for importing and exporting graphs 471 471 and graph related data. Now it supports the LEMON format, the 472 472 \c DIMACS format and the encapsulated postscript (EPS) format. … … 487 487 488 488 This group describes general \c EPS drawing methods and special 489 graph exporting tools. 489 graph exporting tools. 490 490 */ 491 491 … … 499 499 500 500 The purpose of the classes in this group is fourfold. 501 501 502 502 - These classes contain the documentations of the concepts. In order 503 503 to avoid document multiplications, an implementation of a concept … … 552 552 @defgroup tools Standalone utility applications 553 553 554 Some utility applications are listed here. 554 Some utility applications are listed here. 555 555 556 556 The standard compilation procedure (<tt>./configure;make</tt>) will compile 557 them, as well. 558 */ 559 557 them, as well. 558 */ 559 -
doc/lgf.dox
r201 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 44 44 while a quoted token is a 45 45 character sequence surrounded by double quotes, and it can also 46 contain whitespaces and escape sequences. 46 contain whitespaces and escape sequences. 47 47 48 48 The \c \@nodes section describes a set of nodes and associated … … 73 73 \code 74 74 @arcs 75 75 capacity 76 76 1 2 16 77 77 1 3 12 -
doc/license.dox
r40 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 -
doc/mainpage.dox
r40 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 42 42 \subsection howtoread How to read the documentation 43 43 44 If you want to get a quick start and see the most important features then 44 If you want to get a quick start and see the most important features then 45 45 take a look at our \ref quicktour 46 46 "Quick Tour to LEMON" which will guide you along. 47 47 48 If you already feel like using our library, see the page that tells you 48 If you already feel like using our library, see the page that tells you 49 49 \ref getstart "How to start using LEMON". 50 50 51 If you 52 want to see how LEMON works, see 51 If you 52 want to see how LEMON works, see 53 53 some \ref demoprograms "demo programs"! 54 54 -
doc/namespaces.dox
r40 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 -
doc/template.h
r40 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 -
lemon/arg_parser.cc
r137 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 39 39 for(Opts::iterator i=_opts.begin();i!=_opts.end();++i) 40 40 if(i->second.self_delete) 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 } 60 41 switch(i->second.type) { 42 case BOOL: 43 delete i->second.bool_p; 44 break; 45 case STRING: 46 delete i->second.string_p; 47 break; 48 case DOUBLE: 49 delete i->second.double_p; 50 break; 51 case INTEGER: 52 delete i->second.int_p; 53 break; 54 case UNKNOWN: 55 break; 56 case FUNC: 57 break; 58 } 59 } 60 61 61 62 62 ArgParser &ArgParser::intOption(const std::string &name, 63 64 63 const std::string &help, 64 int value, bool obl) 65 65 { 66 66 ParData p; … … 75 75 76 76 ArgParser &ArgParser::doubleOption(const std::string &name, 77 78 77 const std::string &help, 78 double value, bool obl) 79 79 { 80 80 ParData p; … … 89 89 90 90 ArgParser &ArgParser::boolOption(const std::string &name, 91 92 91 const std::string &help, 92 bool value, bool obl) 93 93 { 94 94 ParData p; … … 103 103 104 104 ArgParser &ArgParser::stringOption(const std::string &name, 105 106 105 const std::string &help, 106 std::string value, bool obl) 107 107 { 108 108 ParData p; … … 117 117 118 118 ArgParser &ArgParser::refOption(const std::string &name, 119 120 119 const std::string &help, 120 int &ref, bool obl) 121 121 { 122 122 ParData p; … … 162 162 163 163 ArgParser &ArgParser::refOption(const std::string &name, 164 165 164 const std::string &help, 165 std::string &ref, bool obl) 166 166 { 167 167 ParData p; … … 176 176 177 177 ArgParser &ArgParser::funcOption(const std::string &name, 178 179 178 const std::string &help, 179 void (*func)(void *),void *data) 180 180 { 181 181 ParData p; … … 191 191 192 192 ArgParser &ArgParser::optionGroup(const std::string &group, 193 193 const std::string &opt) 194 194 { 195 195 Opts::iterator i = _opts.find(opt); 196 196 LEMON_ASSERT(i!=_opts.end(), "Unknown option: '"+opt+"'"); 197 LEMON_ASSERT(!(i->second.ingroup), 197 LEMON_ASSERT(!(i->second.ingroup), 198 198 "Option already in option group: '"+opt+"'"); 199 199 GroupData &g=_groups[group]; … … 211 211 212 212 ArgParser &ArgParser::synonym(const std::string &syn, 213 213 const std::string &opt) 214 214 { 215 215 Opts::iterator o = _opts.find(opt); … … 234 234 235 235 ArgParser &ArgParser::other(const std::string &name, 236 236 const std::string &help) 237 237 { 238 238 _others_help.push_back(OtherArg(name,help)); … … 245 245 if(i->second.has_syn) 246 246 for(Opts::iterator j=_opts.begin();j!=_opts.end();++j) 247 248 247 if(j->second.syn&&j->second.help==i->first) 248 os << "|-" << j->first; 249 249 switch(i->second.type) { 250 250 case STRING: … … 271 271 } 272 272 } 273 273 274 274 void ArgParser::showHelp(Opts::iterator i) 275 275 { … … 284 284 if(i->help.size()==0) return; 285 285 std::cerr << " " << i->name << std::endl 286 287 } 288 286 << " " << i->help << std::endl; 287 } 288 289 289 void ArgParser::shortHelp() 290 290 { … … 300 300 if(!g->second.mandatory) cstr << ']'; 301 301 if(pos+cstr.str().size()>LINE_LEN) { 302 303 302 std::cerr << std::endl << indent; 303 pos=indent.size(); 304 304 } 305 305 std::cerr << cstr.str(); … … 308 308 for(Opts::iterator i=_opts.begin();i!=_opts.end();++i) 309 309 if(!i->second.ingroup&&!i->second.syn) { 310 311 312 313 314 315 316 317 318 319 320 310 std::ostringstream cstr; 311 cstr << ' '; 312 if(!i->second.mandatory) cstr << '['; 313 show(cstr,i); 314 if(!i->second.mandatory) cstr << ']'; 315 if(pos+cstr.str().size()>LINE_LEN) { 316 std::cerr << std::endl << indent; 317 pos=indent.size(); 318 } 319 std::cerr << cstr.str(); 320 pos+=cstr.str().size(); 321 321 } 322 322 for(std::vector<OtherArg>::iterator i=_others_help.begin(); 323 323 i!=_others_help.end();++i) 324 324 { 325 326 327 328 329 330 331 332 333 325 std::ostringstream cstr; 326 cstr << ' ' << i->name; 327 328 if(pos+cstr.str().size()>LINE_LEN) { 329 std::cerr << std::endl << indent; 330 pos=indent.size(); 331 } 332 std::cerr << cstr.str(); 333 pos+=cstr.str().size(); 334 334 } 335 335 std::cerr << std::endl; 336 336 } 337 337 338 338 void ArgParser::showHelp() 339 339 { … … 341 341 std::cerr << "Where:\n"; 342 342 for(std::vector<OtherArg>::iterator i=_others_help.begin(); 343 343 i!=_others_help.end();++i) showHelp(i); 344 344 for(Opts::iterator i=_opts.begin();i!=_opts.end();++i) showHelp(i); 345 345 exit(1); 346 346 } 347 348 349 void ArgParser::unknownOpt(std::string arg) 347 348 349 void ArgParser::unknownOpt(std::string arg) 350 350 { 351 351 std::cerr << "\nUnknown option: " << arg << "\n"; … … 354 354 exit(1); 355 355 } 356 357 void ArgParser::requiresValue(std::string arg, OptType t) 356 357 void ArgParser::requiresValue(std::string arg, OptType t) 358 358 { 359 359 std::cerr << "Argument '" << arg << "' requires a"; … … 374 374 showHelp(); 375 375 } 376 376 377 377 378 378 void ArgParser::checkMandatories() … … 380 380 bool ok=true; 381 381 for(Opts::iterator i=_opts.begin();i!=_opts.end();++i) 382 if(i->second.mandatory&&!i->second.set) 383 384 385 std::cerr << _command_name 386 387 388 389 382 if(i->second.mandatory&&!i->second.set) 383 { 384 if(ok) 385 std::cerr << _command_name 386 << ": The following mandatory arguments are missing.\n"; 387 ok=false; 388 showHelp(i); 389 } 390 390 for(Groups::iterator i=_groups.begin();i!=_groups.end();++i) 391 391 if(i->second.mandatory||i->second.only_one) 392 393 394 395 396 397 398 std::cerr << _command_name 399 400 401 402 403 404 405 406 std::cerr << _command_name 407 408 409 410 411 412 413 392 { 393 int set=0; 394 for(GroupData::Opts::iterator o=i->second.opts.begin(); 395 o!=i->second.opts.end();++o) 396 if(_opts.find(*o)->second.set) ++set; 397 if(i->second.mandatory&&!set) { 398 std::cerr << _command_name 399 << ": At least one of the following arguments is mandatory.\n"; 400 ok=false; 401 for(GroupData::Opts::iterator o=i->second.opts.begin(); 402 o!=i->second.opts.end();++o) 403 showHelp(_opts.find(*o)); 404 } 405 if(i->second.only_one&&set>1) { 406 std::cerr << _command_name 407 << ": At most one of the following arguments can be given.\n"; 408 ok=false; 409 for(GroupData::Opts::iterator o=i->second.opts.begin(); 410 o!=i->second.opts.end();++o) 411 showHelp(_opts.find(*o)); 412 } 413 } 414 414 if(!ok) { 415 415 std::cerr << "\nType '" << _command_name << 416 416 " --help' to obtain a short summary on the usage.\n\n"; 417 417 exit(1); 418 418 } … … 424 424 std::string arg(_argv[ar]); 425 425 if (arg[0] != '-' || arg.size() == 1) { 426 426 _file_args.push_back(arg); 427 427 } 428 428 else { 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 429 Opts::iterator i = _opts.find(arg.substr(1)); 430 if(i==_opts.end()) unknownOpt(arg); 431 else { 432 if(i->second.syn) i=_opts.find(i->second.help); 433 ParData &p(i->second); 434 if (p.type==BOOL) *p.bool_p=true; 435 else if (p.type==FUNC) p.func_p.p(p.func_p.data); 436 else if(++ar==_argc) requiresValue(arg, p.type); 437 else { 438 std::string val(_argv[ar]); 439 std::istringstream vals(val); 440 switch(p.type) { 441 case STRING: 442 *p.string_p=val; 443 break; 444 case INTEGER: 445 vals >> *p.int_p; 446 break; 447 case DOUBLE: 448 vals >> *p.double_p; 449 break; 450 default: 451 break; 452 } 453 if(p.type!=STRING&&(!vals||!vals.eof())) 454 requiresValue(arg, p.type); 455 } 456 p.set = true; 457 } 458 458 } 459 459 } … … 461 461 462 462 return *this; 463 } 463 } 464 464 465 465 } -
lemon/arg_parser.h
r204 r209 1 /* -*- C++-*-2 * 3 * This file is a part of LEMON, a generic C++ optimization library 1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 * 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 42 42 ///For a complete example see the \ref arg_parser_demo.cc demo file. 43 43 class ArgParser { 44 44 45 45 static void _showHelp(void *p); 46 46 protected: 47 47 48 48 int _argc; 49 49 const char **_argv; 50 50 51 51 enum OptType { UNKNOWN=0, BOOL=1, STRING=2, DOUBLE=3, INTEGER=4, FUNC=5 }; 52 52 53 53 class ParData { 54 54 public: 55 55 union { 56 57 58 59 60 61 62 63 64 56 bool *bool_p; 57 int *int_p; 58 double *double_p; 59 std::string *string_p; 60 struct { 61 void (*p)(void *); 62 void *data; 63 } func_p; 64 65 65 }; 66 66 std::string help; … … 73 73 bool self_delete; 74 74 ParData() : mandatory(false), type(UNKNOWN), set(false), ingroup(false), 75 75 has_syn(false), syn(false), self_delete(false) {} 76 76 }; 77 77 … … 79 79 Opts _opts; 80 80 81 class GroupData 81 class GroupData 82 82 { 83 83 public: … … 88 88 GroupData() :only_one(false), mandatory(false) {} 89 89 }; 90 90 91 91 typedef std::map<std::string,GroupData> Groups; 92 92 Groups _groups; … … 99 99 100 100 }; 101 101 102 102 std::vector<OtherArg> _others_help; 103 103 std::vector<std::string> _file_args; 104 104 std::string _command_name; 105 105 106 106 107 107 private: 108 108 //Bind a function to an option. … … 114 114 //\param data Data to be passed to \c func 115 115 ArgParser &funcOption(const std::string &name, 116 117 118 116 const std::string &help, 117 void (*func)(void *),void *data); 118 119 119 public: 120 120 … … 137 137 ///\param obl Indicate if the option is mandatory. 138 138 ArgParser &intOption(const std::string &name, 139 140 139 const std::string &help, 140 int value=0, bool obl=false); 141 141 142 142 ///Add a new floating point type option … … 148 148 ///\param obl Indicate if the option is mandatory. 149 149 ArgParser &doubleOption(const std::string &name, 150 151 150 const std::string &help, 151 double value=0, bool obl=false); 152 152 153 153 ///Add a new bool type option … … 160 160 ///\note A mandatory bool obtion is of very little use. 161 161 ArgParser &boolOption(const std::string &name, 162 163 162 const std::string &help, 163 bool value=false, bool obl=false); 164 164 165 165 ///Add a new string type option … … 171 171 ///\param obl Indicate if the option is mandatory. 172 172 ArgParser &stringOption(const std::string &name, 173 174 173 const std::string &help, 174 std::string value="", bool obl=false); 175 175 176 176 ///Give help string for non-parsed arguments. … … 180 180 ///\c help gives a more detailed description. 181 181 ArgParser &other(const std::string &name, 182 183 182 const std::string &help=""); 183 184 184 ///@} 185 185 … … 198 198 ///\retval ref The value of the argument will be written to this variable. 199 199 ArgParser &refOption(const std::string &name, 200 201 200 const std::string &help, 201 int &ref, bool obl=false); 202 202 203 203 ///Add a new floating type option with a storage reference … … 209 209 ///\retval ref The value of the argument will be written to this variable. 210 210 ArgParser &refOption(const std::string &name, 211 212 211 const std::string &help, 212 double &ref, bool obl=false); 213 213 214 214 ///Add a new bool type option with a storage reference … … 221 221 ///\note A mandatory bool obtion is of very little use. 222 222 ArgParser &refOption(const std::string &name, 223 224 223 const std::string &help, 224 bool &ref, bool obl=false); 225 225 226 226 ///Add a new string type option with a storage reference … … 232 232 ///\retval ref The value of the argument will be written to this variable. 233 233 ArgParser &refOption(const std::string &name, 234 235 236 234 const std::string &help, 235 std::string &ref, bool obl=false); 236 237 237 ///@} 238 238 239 239 ///\name Option Groups and Synonyms 240 240 /// 241 241 242 242 ///@{ 243 243 … … 249 249 ///\param opt The option name. 250 250 ArgParser &optionGroup(const std::string &group, 251 251 const std::string &opt); 252 252 253 253 ///Make the members of a group exclusive … … 256 256 ///given at the same time. 257 257 ArgParser &onlyOneGroup(const std::string &group); 258 258 259 259 ///Make a group mandatory 260 260 … … 262 262 ///must be given. 263 263 ArgParser &mandatoryGroup(const std::string &group); 264 264 265 265 ///Create synonym to an option 266 266 … … 268 268 ///option \c opt. 269 269 ArgParser &synonym(const std::string &syn, 270 271 270 const std::string &opt); 271 272 272 ///@} 273 273 … … 283 283 void requiresValue(std::string arg, OptType t); 284 284 void checkMandatories(); 285 285 286 286 ///Start the parsing process 287 287 ArgParser &parse(); 288 288 289 289 /// Synonym for parse() 290 ArgParser &run() 290 ArgParser &run() 291 291 { 292 292 return parse(); 293 293 } 294 294 295 295 ///Give back the command name (the 0th argument) 296 296 const std::string &commandName() { return _command_name; } 297 297 298 298 ///Check if an opion has been given to the command. 299 bool given(std::string op) 299 bool given(std::string op) 300 300 { 301 301 Opts::iterator i = _opts.find(op); … … 305 305 306 306 ///Magic type for operator[] 307 307 308 308 ///This is the type of the return value of ArgParser::operator[](). 309 309 ///It automatically converts to \c int, \c double, \c bool or 310 310 ///\c std::string if the type of the option matches, otherwise it 311 311 ///throws an exception (i.e. it performs runtime type checking). 312 class RefType 312 class RefType 313 313 { 314 314 ArgParser &_parser; … … 318 318 RefType(ArgParser &p,const std::string &n) :_parser(p),_name(n) {} 319 319 ///\e 320 operator bool() 320 operator bool() 321 321 { 322 323 324 325 326 327 322 Opts::iterator i = _parser._opts.find(_name); 323 LEMON_ASSERT(i!=_parser._opts.end(), 324 std::string()+"Unkown option: '"+_name+"'"); 325 LEMON_ASSERT(i->second.type==ArgParser::BOOL, 326 std::string()+"'"+_name+"' is a bool option"); 327 return *(i->second.bool_p); 328 328 } 329 329 ///\e 330 330 operator std::string() 331 331 { 332 333 334 335 336 337 332 Opts::iterator i = _parser._opts.find(_name); 333 LEMON_ASSERT(i!=_parser._opts.end(), 334 std::string()+"Unkown option: '"+_name+"'"); 335 LEMON_ASSERT(i->second.type==ArgParser::STRING, 336 std::string()+"'"+_name+"' is a string option"); 337 return *(i->second.string_p); 338 338 } 339 339 ///\e 340 operator double() 340 operator double() 341 341 { 342 343 344 345 346 347 348 349 342 Opts::iterator i = _parser._opts.find(_name); 343 LEMON_ASSERT(i!=_parser._opts.end(), 344 std::string()+"Unkown option: '"+_name+"'"); 345 LEMON_ASSERT(i->second.type==ArgParser::DOUBLE || 346 i->second.type==ArgParser::INTEGER, 347 std::string()+"'"+_name+"' is a floating point option"); 348 return i->second.type==ArgParser::DOUBLE ? 349 *(i->second.double_p) : *(i->second.int_p); 350 350 } 351 351 ///\e 352 operator int() 352 operator int() 353 353 { 354 355 356 357 358 359 354 Opts::iterator i = _parser._opts.find(_name); 355 LEMON_ASSERT(i!=_parser._opts.end(), 356 std::string()+"Unkown option: '"+_name+"'"); 357 LEMON_ASSERT(i->second.type==ArgParser::INTEGER, 358 std::string()+"'"+_name+"' is an integer option"); 359 return *(i->second.int_p); 360 360 } 361 361 … … 363 363 364 364 ///Give back the value of an option 365 365 366 366 ///Give back the value of an option. 367 367 ///\sa RefType … … 369 369 { 370 370 return RefType(*this, n); 371 } 371 } 372 372 373 373 ///Give back the non-option type arguments. … … 376 376 ///not starting with a '-' character. 377 377 std::vector<std::string> &files() { return _file_args; } 378 378 379 379 }; 380 380 } -
lemon/assert.h
r142 r209 1 /* -*- C++-*-2 * 3 * This file is a part of LEMON, a generic C++ optimization library 1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 * 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 29 29 30 30 inline void assert_fail_log(const char *file, int line, const char *function, 31 31 const char *message, const char *assertion) 32 32 { 33 33 std::cerr << file << ":" << line << ": "; … … 41 41 42 42 inline void assert_fail_abort(const char *file, int line, 43 44 43 const char *function, const char* message, 44 const char *assertion) 45 45 { 46 46 assert_fail_log(file, line, function, message, assertion); … … 49 49 50 50 namespace _assert_bits { 51 52 51 52 53 53 inline const char* cstringify(const std::string& str) { 54 54 return str.c_str(); … … 57 57 inline const char* cstringify(const char* str) { 58 58 return str; 59 } 59 } 60 60 } 61 61 } … … 67 67 #undef LEMON_DEBUG 68 68 69 #if (defined(LEMON_ASSERT_LOG) ? 1 : 0) + 70 (defined(LEMON_ASSERT_ABORT) ? 1 : 0) + 69 #if (defined(LEMON_ASSERT_LOG) ? 1 : 0) + \ 70 (defined(LEMON_ASSERT_ABORT) ? 1 : 0) + \ 71 71 (defined(LEMON_ASSERT_CUSTOM) ? 1 : 0) > 1 72 72 #error "LEMON assertion system is not set properly" 73 73 #endif 74 74 75 #if ((defined(LEMON_ASSERT_LOG) ? 1 : 0) + 76 (defined(LEMON_ASSERT_ABORT) ? 1 : 0) + 77 (defined(LEMON_ASSERT_CUSTOM) ? 1 : 0) == 1 || 78 defined(LEMON_ENABLE_ASSERTS)) && 79 (defined(LEMON_DISABLE_ASSERTS) || 75 #if ((defined(LEMON_ASSERT_LOG) ? 1 : 0) + \ 76 (defined(LEMON_ASSERT_ABORT) ? 1 : 0) + \ 77 (defined(LEMON_ASSERT_CUSTOM) ? 1 : 0) == 1 || \ 78 defined(LEMON_ENABLE_ASSERTS)) && \ 79 (defined(LEMON_DISABLE_ASSERTS) || \ 80 80 defined(NDEBUG)) 81 81 #error "LEMON assertion system is not set properly" … … 137 137 /// \endcode 138 138 /// The checking is also disabled when the standard macro \c NDEBUG is defined. 139 /// 139 /// 140 140 /// The LEMON assertion system has a wide range of customization 141 141 /// properties. As a default behaviour the failed assertion prints a 142 142 /// short log message to the standard error and aborts the execution. 143 143 /// 144 /// The following modes can be used in the assertion system: 144 /// The following modes can be used in the assertion system: 145 145 /// 146 146 /// - \c LEMON_ASSERT_LOG The failed assertion prints a short log … … 156 156 /// \endcode 157 157 /// The name of the function should be defined as the \c 158 /// LEMON_CUSTOM_ASSERT_HANDLER macro name. 158 /// LEMON_CUSTOM_ASSERT_HANDLER macro name. 159 159 /// \code 160 160 /// #define LEMON_CUSTOM_ASSERT_HANDLER custom_assert_handler … … 167 167 /// \ref lemon/assert.h "assert.h" file is reincluded, then the 168 168 /// behaviour is changed appropiately to the new settings. 169 # define LEMON_ASSERT(exp, msg) 170 (static_cast<void> (!!(exp) ? 0 : ( 171 LEMON_ASSERT_HANDLER(__FILE__, __LINE__, 172 LEMON_FUNCTION_NAME,\173 169 # define LEMON_ASSERT(exp, msg) \ 170 (static_cast<void> (!!(exp) ? 0 : ( \ 171 LEMON_ASSERT_HANDLER(__FILE__, __LINE__, \ 172 LEMON_FUNCTION_NAME, \ 173 ::lemon::_assert_bits::cstringify(msg), #exp), 0))) 174 174 175 175 /// \ingroup exceptions … … 183 183 /// \endcode 184 184 /// 185 /// \see LEMON_ASSERT 186 # define LEMON_FIXME(msg) 187 (LEMON_ASSERT_HANDLER(__FILE__, __LINE__, LEMON_FUNCTION_NAME, 188 ::lemon::_assert_bits::cstringify(msg),\189 185 /// \see LEMON_ASSERT 186 # define LEMON_FIXME(msg) \ 187 (LEMON_ASSERT_HANDLER(__FILE__, __LINE__, LEMON_FUNCTION_NAME, \ 188 ::lemon::_assert_bits::cstringify(msg), \ 189 static_cast<const char*>(0))) 190 190 191 191 /// \ingroup exceptions … … 211 211 /// macro. 212 212 /// 213 /// \see LEMON_ASSERT 214 # define LEMON_DEBUG(exp, msg) 215 (static_cast<void> (!!(exp) ? 0 : ( 213 /// \see LEMON_ASSERT 214 # define LEMON_DEBUG(exp, msg) \ 215 (static_cast<void> (!!(exp) ? 0 : ( \ 216 216 LEMON_ASSERT_HANDLER(__FILE__, __LINE__, \ 217 LEMON_FUNCTION_NAME,\218 217 LEMON_FUNCTION_NAME, \ 218 ::lemon::_assert_bits::cstringify(msg), #exp), 0))) 219 219 220 220 #else … … 225 225 # define LEMON_DEBUG(exp, msg) (static_cast<void>(0)) 226 226 # else 227 # define LEMON_ASSERT(exp, msg) 228 (static_cast<void> (!!(exp) ? 0 : ( 227 # define LEMON_ASSERT(exp, msg) \ 228 (static_cast<void> (!!(exp) ? 0 : ( \ 229 229 LEMON_ASSERT_HANDLER(__FILE__, __LINE__, \ 230 LEMON_FUNCTION_NAME,\231 ::lemon::_assert_bits::cstringify(msg),\232 233 # define LEMON_FIXME(msg) 234 (LEMON_ASSERT_HANDLER(__FILE__, __LINE__, LEMON_FUNCTION_NAME, 235 ::lemon::_assert_bits::cstringify(msg),\236 230 LEMON_FUNCTION_NAME, \ 231 ::lemon::_assert_bits::cstringify(msg), \ 232 #exp), 0))) 233 # define LEMON_FIXME(msg) \ 234 (LEMON_ASSERT_HANDLER(__FILE__, __LINE__, LEMON_FUNCTION_NAME, \ 235 ::lemon::_assert_bits::cstringify(msg), \ 236 static_cast<const char*>(0))) 237 237 238 238 # if LEMON_ENABLE_DEBUG … … 241 241 LEMON_ASSERT_HANDLER(__FILE__, __LINE__, \ 242 242 LEMON_FUNCTION_NAME, \ 243 ::lemon::_assert_bits::cstringify(msg),\244 243 ::lemon::_assert_bits::cstringify(msg), \ 244 #exp), 0))) 245 245 # else 246 246 # define LEMON_DEBUG(exp, msg) (static_cast<void>(0)) -
lemon/base.cc
r49 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 -
lemon/bfs.h
r158 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 34 34 35 35 36 36 37 37 ///Default traits class of Bfs class. 38 38 … … 42 42 struct BfsDefaultTraits 43 43 { 44 ///The digraph type the algorithm runs on. 44 ///The digraph type the algorithm runs on. 45 45 typedef GR Digraph; 46 46 ///\brief The type of the map that stores the last 47 47 ///arcs of the shortest paths. 48 /// 48 /// 49 49 ///The type of the map that stores the last 50 50 ///arcs of the shortest paths. … … 53 53 typedef typename Digraph::template NodeMap<typename GR::Arc> PredMap; 54 54 ///Instantiates a PredMap. 55 56 ///This function instantiates a \ref PredMap. 55 56 ///This function instantiates a \ref PredMap. 57 57 ///\param G is the digraph, to which we would like to define the PredMap. 58 58 ///\todo The digraph alone may be insufficient to initialize 59 static PredMap *createPredMap(const GR &G) 59 static PredMap *createPredMap(const GR &G) 60 60 { 61 61 return new PredMap(G); 62 62 } 63 63 ///The type of the map that indicates which nodes are processed. 64 64 65 65 ///The type of the map that indicates which nodes are processed. 66 66 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. … … 68 68 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; 69 69 ///Instantiates a ProcessedMap. 70 71 ///This function instantiates a \ref ProcessedMap. 70 71 ///This function instantiates a \ref ProcessedMap. 72 72 ///\param g is the digraph, to which 73 73 ///we would like to define the \ref ProcessedMap … … 81 81 } 82 82 ///The type of the map that indicates which nodes are reached. 83 83 84 84 ///The type of the map that indicates which nodes are reached. 85 85 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. … … 87 87 typedef typename Digraph::template NodeMap<bool> ReachedMap; 88 88 ///Instantiates a ReachedMap. 89 90 ///This function instantiates a \ref ReachedMap. 89 90 ///This function instantiates a \ref ReachedMap. 91 91 ///\param G is the digraph, to which 92 92 ///we would like to define the \ref ReachedMap. … … 96 96 } 97 97 ///The type of the map that stores the dists of the nodes. 98 98 99 99 ///The type of the map that stores the dists of the nodes. 100 100 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. … … 102 102 typedef typename Digraph::template NodeMap<int> DistMap; 103 103 ///Instantiates a DistMap. 104 105 ///This function instantiates a \ref DistMap. 104 105 ///This function instantiates a \ref DistMap. 106 106 ///\param G is the digraph, to which we would like to define the \ref DistMap 107 107 static DistMap *createDistMap(const GR &G) … … 110 110 } 111 111 }; 112 112 113 113 ///%BFS algorithm class. 114 114 115 115 ///\ingroup search 116 116 ///This class provides an efficient implementation of the %BFS algorithm. … … 127 127 #ifdef DOXYGEN 128 128 template <typename GR, 129 129 typename TR> 130 130 #else 131 131 template <typename GR=ListDigraph, 132 132 typename TR=BfsDefaultTraits<GR> > 133 133 #endif 134 134 class Bfs { … … 143 143 public: 144 144 virtual const char* what() const throw() { 145 145 return "lemon::Bfs::UninitializedParameter"; 146 146 } 147 147 }; … … 150 150 ///The type of the underlying digraph. 151 151 typedef typename TR::Digraph Digraph; 152 152 153 153 ///\brief The type of the map that stores the last 154 154 ///arcs of the shortest paths. … … 191 191 192 192 ///Creates the maps if necessary. 193 193 194 194 ///\todo Better memory allocation (instead of new). 195 void create_maps() 195 void create_maps() 196 196 { 197 197 if(!_pred) { 198 199 198 local_pred = true; 199 _pred = Traits::createPredMap(*G); 200 200 } 201 201 if(!_dist) { 202 203 202 local_dist = true; 203 _dist = Traits::createDistMap(*G); 204 204 } 205 205 if(!_reached) { 206 207 206 local_reached = true; 207 _reached = Traits::createReachedMap(*G); 208 208 } 209 209 if(!_processed) { 210 211 210 local_processed = true; 211 _processed = Traits::createProcessedMap(*G); 212 212 } 213 213 } 214 214 215 215 protected: 216 216 217 217 Bfs() {} 218 218 219 219 public: 220 220 221 221 typedef Bfs Create; 222 222 … … 228 228 struct DefPredMapTraits : public Traits { 229 229 typedef T PredMap; 230 static PredMap *createPredMap(const Digraph &) 230 static PredMap *createPredMap(const Digraph &) 231 231 { 232 232 throw UninitializedParameter(); 233 233 } 234 234 }; … … 239 239 /// 240 240 template <class T> 241 struct DefPredMap : public Bfs< Digraph, DefPredMapTraits<T> > { 241 struct DefPredMap : public Bfs< Digraph, DefPredMapTraits<T> > { 242 242 typedef Bfs< Digraph, DefPredMapTraits<T> > Create; 243 243 }; 244 244 245 245 template <class T> 246 246 struct DefDistMapTraits : public Traits { 247 247 typedef T DistMap; 248 static DistMap *createDistMap(const Digraph &) 248 static DistMap *createDistMap(const Digraph &) 249 249 { 250 250 throw UninitializedParameter(); 251 251 } 252 252 }; … … 257 257 /// 258 258 template <class T> 259 struct DefDistMap : public Bfs< Digraph, DefDistMapTraits<T> > { 259 struct DefDistMap : public Bfs< Digraph, DefDistMapTraits<T> > { 260 260 typedef Bfs< Digraph, DefDistMapTraits<T> > Create; 261 261 }; 262 262 263 263 template <class T> 264 264 struct DefReachedMapTraits : public Traits { 265 265 typedef T ReachedMap; 266 static ReachedMap *createReachedMap(const Digraph &) 266 static ReachedMap *createReachedMap(const Digraph &) 267 267 { 268 268 throw UninitializedParameter(); 269 269 } 270 270 }; … … 275 275 /// 276 276 template <class T> 277 struct DefReachedMap : public Bfs< Digraph, DefReachedMapTraits<T> > { 277 struct DefReachedMap : public Bfs< Digraph, DefReachedMapTraits<T> > { 278 278 typedef Bfs< Digraph, DefReachedMapTraits<T> > Create; 279 279 }; 280 280 281 281 template <class T> 282 282 struct DefProcessedMapTraits : public Traits { 283 283 typedef T ProcessedMap; 284 static ProcessedMap *createProcessedMap(const Digraph &) 284 static ProcessedMap *createProcessedMap(const Digraph &) 285 285 { 286 286 throw UninitializedParameter(); 287 287 } 288 288 }; … … 296 296 typedef Bfs< Digraph, DefProcessedMapTraits<T> > Create; 297 297 }; 298 298 299 299 struct DefDigraphProcessedMapTraits : public Traits { 300 300 typedef typename Digraph::template NodeMap<bool> ProcessedMap; 301 static ProcessedMap *createProcessedMap(const Digraph &G) 301 static ProcessedMap *createProcessedMap(const Digraph &G) 302 302 { 303 303 return new ProcessedMap(G); 304 304 } 305 305 }; … … 312 312 template <class T> 313 313 struct DefProcessedMapToBeDefaultMap : 314 public Bfs< Digraph, DefDigraphProcessedMapTraits> { 314 public Bfs< Digraph, DefDigraphProcessedMapTraits> { 315 315 typedef Bfs< Digraph, DefDigraphProcessedMapTraits> Create; 316 316 }; 317 317 318 318 ///@} 319 319 320 public: 321 320 public: 321 322 322 ///Constructor. 323 323 324 324 ///\param _G the digraph the algorithm will run on. 325 325 /// … … 331 331 _processed(NULL), local_processed(false) 332 332 { } 333 333 334 334 ///Destructor. 335 ~Bfs() 335 ~Bfs() 336 336 { 337 337 if(local_pred) delete _pred; … … 348 348 ///automatically allocated map, of course. 349 349 ///\return <tt> (*this) </tt> 350 Bfs &predMap(PredMap &m) 350 Bfs &predMap(PredMap &m) 351 351 { 352 352 if(local_pred) { 353 354 353 delete _pred; 354 local_pred=false; 355 355 } 356 356 _pred = &m; … … 365 365 ///automatically allocated map, of course. 366 366 ///\return <tt> (*this) </tt> 367 Bfs &reachedMap(ReachedMap &m) 367 Bfs &reachedMap(ReachedMap &m) 368 368 { 369 369 if(local_reached) { 370 371 370 delete _reached; 371 local_reached=false; 372 372 } 373 373 _reached = &m; … … 382 382 ///automatically allocated map, of course. 383 383 ///\return <tt> (*this) </tt> 384 Bfs &processedMap(ProcessedMap &m) 384 Bfs &processedMap(ProcessedMap &m) 385 385 { 386 386 if(local_processed) { 387 388 387 delete _processed; 388 local_processed=false; 389 389 } 390 390 _processed = &m; … … 399 399 ///automatically allocated map, of course. 400 400 ///\return <tt> (*this) </tt> 401 Bfs &distMap(DistMap &m) 401 Bfs &distMap(DistMap &m) 402 402 { 403 403 if(local_dist) { 404 405 404 delete _dist; 405 local_dist=false; 406 406 } 407 407 _dist = &m; … … 433 433 _curr_dist=1; 434 434 for ( NodeIt u(*G) ; u!=INVALID ; ++u ) { 435 436 437 438 } 439 } 440 435 _pred->set(u,INVALID); 436 _reached->set(u,false); 437 _processed->set(u,false); 438 } 439 } 440 441 441 ///Adds a new source node. 442 442 … … 446 446 { 447 447 if(!(*_reached)[s]) 448 449 450 451 452 453 454 455 } 456 448 { 449 _reached->set(s,true); 450 _pred->set(s,INVALID); 451 _dist->set(s,0); 452 _queue[_queue_head++]=s; 453 _queue_next_dist=_queue_head; 454 } 455 } 456 457 457 ///Processes the next node. 458 458 … … 465 465 { 466 466 if(_queue_tail==_queue_next_dist) { 467 468 467 _curr_dist++; 468 _queue_next_dist=_queue_head; 469 469 } 470 470 Node n=_queue[_queue_tail++]; … … 472 472 Node m; 473 473 for(OutArcIt e(*G,n);e!=INVALID;++e) 474 475 476 477 478 479 474 if(!(*_reached)[m=G->target(e)]) { 475 _queue[_queue_head++]=m; 476 _reached->set(m,true); 477 _pred->set(m,e); 478 _dist->set(m,_curr_dist); 479 } 480 480 return n; 481 481 } … … 496 496 { 497 497 if(_queue_tail==_queue_next_dist) { 498 499 498 _curr_dist++; 499 _queue_next_dist=_queue_head; 500 500 } 501 501 Node n=_queue[_queue_tail++]; … … 503 503 Node m; 504 504 for(OutArcIt e(*G,n);e!=INVALID;++e) 505 506 507 508 509 505 if(!(*_reached)[m=G->target(e)]) { 506 _queue[_queue_head++]=m; 507 _reached->set(m,true); 508 _pred->set(m,e); 509 _dist->set(m,_curr_dist); 510 510 reach = reach || (target == m); 511 511 } 512 512 return n; 513 513 } … … 529 529 { 530 530 if(_queue_tail==_queue_next_dist) { 531 532 531 _curr_dist++; 532 _queue_next_dist=_queue_head; 533 533 } 534 534 Node n=_queue[_queue_tail++]; … … 536 536 Node m; 537 537 for(OutArcIt e(*G,n);e!=INVALID;++e) 538 539 540 541 542 543 544 538 if(!(*_reached)[m=G->target(e)]) { 539 _queue[_queue_head++]=m; 540 _reached->set(m,true); 541 _pred->set(m,e); 542 _dist->set(m,_curr_dist); 543 if (nm[m] && rnode == INVALID) rnode = m; 544 } 545 545 return n; 546 546 } 547 547 548 548 ///Next node to be processed. 549 549 … … 553 553 /// empty. 554 554 Node nextNode() 555 { 555 { 556 556 return _queue_tail<_queue_head?_queue[_queue_tail]:INVALID; 557 557 } 558 558 559 559 ///\brief Returns \c false if there are nodes 560 560 ///to be processed in the queue … … 564 564 bool emptyQueue() { return _queue_tail==_queue_head; } 565 565 ///Returns the number of the nodes to be processed. 566 566 567 567 ///Returns the number of the nodes to be processed in the queue. 568 568 int queueSize() { return _queue_head-_queue_tail; } 569 569 570 570 ///Executes the algorithm. 571 571 … … 585 585 while ( !emptyQueue() ) processNextNode(); 586 586 } 587 587 588 588 ///Executes the algorithm until \c dest is reached. 589 589 … … 603 603 while ( !emptyQueue() && !reach ) processNextNode(dest, reach); 604 604 } 605 605 606 606 ///Executes the algorithm until a condition is met. 607 607 … … 622 622 Node rnode = INVALID; 623 623 while ( !emptyQueue() && rnode == INVALID ) { 624 624 processNextNode(nm, rnode); 625 625 } 626 626 return rnode; 627 627 } 628 628 629 629 ///Runs %BFS algorithm from node \c s. 630 630 631 631 ///This method runs the %BFS algorithm from a root node \c s 632 632 ///in order to … … 647 647 start(); 648 648 } 649 649 650 650 ///Finds the shortest path between \c s and \c t. 651 651 652 652 ///Finds the shortest path between \c s and \c t. 653 653 /// … … 667 667 return reached(t) ? _curr_dist : 0; 668 668 } 669 669 670 670 ///@} 671 671 … … 675 675 ///Before the use of these functions, 676 676 ///either run() or start() must be calleb. 677 677 678 678 ///@{ 679 679 … … 681 681 682 682 ///Gives back the shortest path. 683 683 684 684 ///Gives back the shortest path. 685 685 ///\pre The \c t should be reachable from the source. 686 Path path(Node t) 686 Path path(Node t) 687 687 { 688 688 return Path(*G, *_pred, t); … … 723 723 ///using this function. 724 724 Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID: 725 726 725 G->source((*_pred)[v]); } 726 727 727 ///Returns a reference to the NodeMap of distances. 728 728 … … 731 731 ///be called before using this function. 732 732 const DistMap &distMap() const { return *_dist;} 733 733 734 734 ///Returns a reference to the shortest path tree map. 735 735 … … 739 739 ///must be called before using this function. 740 740 const PredMap &predMap() const { return *_pred;} 741 741 742 742 ///Checks if a node is reachable from the root. 743 743 … … 748 748 /// 749 749 bool reached(Node v) { return (*_reached)[v]; } 750 750 751 751 ///@} 752 752 }; … … 759 759 struct BfsWizardDefaultTraits 760 760 { 761 ///The digraph type the algorithm runs on. 761 ///The digraph type the algorithm runs on. 762 762 typedef GR Digraph; 763 763 ///\brief The type of the map that stores the last 764 764 ///arcs of the shortest paths. 765 /// 765 /// 766 766 ///The type of the map that stores the last 767 767 ///arcs of the shortest paths. … … 770 770 typedef NullMap<typename Digraph::Node,typename GR::Arc> PredMap; 771 771 ///Instantiates a PredMap. 772 773 ///This function instantiates a \ref PredMap. 772 773 ///This function instantiates a \ref PredMap. 774 774 ///\param g is the digraph, to which we would like to define the PredMap. 775 775 ///\todo The digraph alone may be insufficient to initialize 776 776 #ifdef DOXYGEN 777 static PredMap *createPredMap(const GR &g) 777 static PredMap *createPredMap(const GR &g) 778 778 #else 779 static PredMap *createPredMap(const GR &) 779 static PredMap *createPredMap(const GR &) 780 780 #endif 781 781 { … … 784 784 785 785 ///The type of the map that indicates which nodes are processed. 786 786 787 787 ///The type of the map that indicates which nodes are processed. 788 788 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. … … 790 790 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; 791 791 ///Instantiates a ProcessedMap. 792 793 ///This function instantiates a \ref ProcessedMap. 792 793 ///This function instantiates a \ref ProcessedMap. 794 794 ///\param g is the digraph, to which 795 795 ///we would like to define the \ref ProcessedMap … … 803 803 } 804 804 ///The type of the map that indicates which nodes are reached. 805 805 806 806 ///The type of the map that indicates which nodes are reached. 807 807 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. … … 809 809 typedef typename Digraph::template NodeMap<bool> ReachedMap; 810 810 ///Instantiates a ReachedMap. 811 812 ///This function instantiates a \ref ReachedMap. 811 812 ///This function instantiates a \ref ReachedMap. 813 813 ///\param G is the digraph, to which 814 814 ///we would like to define the \ref ReachedMap. … … 818 818 } 819 819 ///The type of the map that stores the dists of the nodes. 820 820 821 821 ///The type of the map that stores the dists of the nodes. 822 822 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. … … 824 824 typedef NullMap<typename Digraph::Node,int> DistMap; 825 825 ///Instantiates a DistMap. 826 827 ///This function instantiates a \ref DistMap. 826 827 ///This function instantiates a \ref DistMap. 828 828 ///\param g is the digraph, to which we would like to define the \ref DistMap 829 829 #ifdef DOXYGEN … … 836 836 } 837 837 }; 838 838 839 839 /// Default traits used by \ref BfsWizard 840 840 … … 866 866 ///Pointer to the source node. 867 867 Node _source; 868 868 869 869 public: 870 870 /// Constructor. 871 871 872 872 /// This constructor does not require parameters, therefore it initiates 873 873 /// all of the attributes to default values (0, INVALID). 874 874 BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0), 875 875 _dist(0), _source(INVALID) {} 876 876 877 877 /// Constructor. 878 878 879 879 /// This constructor requires some parameters, 880 880 /// listed in the parameters list. … … 883 883 /// \param s is the initial value of \ref _source 884 884 BfsWizardBase(const GR &g, Node s=INVALID) : 885 _g(reinterpret_cast<void*>(const_cast<GR*>(&g))), 885 _g(reinterpret_cast<void*>(const_cast<GR*>(&g))), 886 886 _reached(0), _processed(0), _pred(0), _dist(0), _source(s) {} 887 887 888 888 }; 889 889 890 890 /// A class to make the usage of Bfs algorithm easier 891 891 … … 922 922 //\e 923 923 typedef typename Digraph::OutArcIt OutArcIt; 924 924 925 925 ///\brief The type of the map that stores 926 926 ///the reached nodes … … 952 952 953 953 ///Runs Bfs algorithm from a given node. 954 954 955 955 ///Runs Bfs algorithm from a given node. 956 956 ///The node can be given by the \ref source function. … … 960 960 Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g)); 961 961 if(Base::_reached) 962 963 if(Base::_processed) 962 alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached)); 963 if(Base::_processed) 964 964 alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed)); 965 if(Base::_pred) 965 if(Base::_pred) 966 966 alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred)); 967 if(Base::_dist) 967 if(Base::_dist) 968 968 alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist)); 969 969 alg.run(Base::_source); … … 986 986 DefPredMapBase(const TR &b) : TR(b) {} 987 987 }; 988 988 989 989 ///\brief \ref named-templ-param "Named parameter" 990 990 ///function for setting PredMap … … 994 994 /// 995 995 template<class T> 996 BfsWizard<DefPredMapBase<T> > predMap(const T &t) 996 BfsWizard<DefPredMapBase<T> > predMap(const T &t) 997 997 { 998 998 Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t)); 999 999 return BfsWizard<DefPredMapBase<T> >(*this); 1000 1000 } 1001 1002 1001 1002 1003 1003 template<class T> 1004 1004 struct DefReachedMapBase : public Base { … … 1007 1007 DefReachedMapBase(const TR &b) : TR(b) {} 1008 1008 }; 1009 1009 1010 1010 ///\brief \ref named-templ-param "Named parameter" 1011 1011 ///function for setting ReachedMap … … 1015 1015 /// 1016 1016 template<class T> 1017 BfsWizard<DefReachedMapBase<T> > reachedMap(const T &t) 1017 BfsWizard<DefReachedMapBase<T> > reachedMap(const T &t) 1018 1018 { 1019 1019 Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t)); 1020 1020 return BfsWizard<DefReachedMapBase<T> >(*this); 1021 1021 } 1022 1022 1023 1023 1024 1024 template<class T> … … 1028 1028 DefProcessedMapBase(const TR &b) : TR(b) {} 1029 1029 }; 1030 1030 1031 1031 ///\brief \ref named-templ-param "Named parameter" 1032 1032 ///function for setting ProcessedMap … … 1036 1036 /// 1037 1037 template<class T> 1038 BfsWizard<DefProcessedMapBase<T> > processedMap(const T &t) 1038 BfsWizard<DefProcessedMapBase<T> > processedMap(const T &t) 1039 1039 { 1040 1040 Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t)); 1041 1041 return BfsWizard<DefProcessedMapBase<T> >(*this); 1042 1042 } 1043 1044 1043 1044 1045 1045 template<class T> 1046 1046 struct DefDistMapBase : public Base { … … 1049 1049 DefDistMapBase(const TR &b) : TR(b) {} 1050 1050 }; 1051 1051 1052 1052 ///\brief \ref named-templ-param "Named parameter" 1053 1053 ///function for setting DistMap type … … 1057 1057 /// 1058 1058 template<class T> 1059 BfsWizard<DefDistMapBase<T> > distMap(const T &t) 1059 BfsWizard<DefDistMapBase<T> > distMap(const T &t) 1060 1060 { 1061 1061 Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t)); 1062 1062 return BfsWizard<DefDistMapBase<T> >(*this); 1063 1063 } 1064 1064 1065 1065 /// Sets the source node, from which the Bfs algorithm runs. 1066 1066 1067 1067 /// Sets the source node, from which the Bfs algorithm runs. 1068 1068 /// \param s is the source node. 1069 BfsWizard<TR> &source(Node s) 1069 BfsWizard<TR> &source(Node s) 1070 1070 { 1071 1071 Base::_source=s; 1072 1072 return *this; 1073 1073 } 1074 1074 1075 1075 }; 1076 1076 1077 1077 ///Function type interface for Bfs algorithm. 1078 1078 … … 1101 1101 #ifdef DOXYGEN 1102 1102 /// \brief Visitor class for bfs. 1103 /// 1103 /// 1104 1104 /// This class defines the interface of the BfsVisit events, and 1105 1105 /// it could be the base of a real Visitor class. … … 1110 1110 typedef typename Digraph::Node Node; 1111 1111 /// \brief Called when the arc reach a node. 1112 /// 1112 /// 1113 1113 /// It is called when the bfs find an arc which target is not 1114 1114 /// reached yet. 1115 1115 void discover(const Arc& arc) {} 1116 1116 /// \brief Called when the node reached first time. 1117 /// 1117 /// 1118 1118 /// It is Called when the node reached first time. 1119 1119 void reach(const Node& node) {} 1120 /// \brief Called when the arc examined but target of the arc 1120 /// \brief Called when the arc examined but target of the arc 1121 1121 /// already discovered. 1122 /// 1123 /// It called when the arc examined but the target of the arc 1122 /// 1123 /// It called when the arc examined but the target of the arc 1124 1124 /// already discovered. 1125 1125 void examine(const Arc& arc) {} 1126 1126 /// \brief Called for the source node of the bfs. 1127 /// 1127 /// 1128 1128 /// It is called for the source node of the bfs. 1129 1129 void start(const Node& node) {} 1130 1130 /// \brief Called when the node processed. 1131 /// 1131 /// 1132 1132 /// It is Called when the node processed. 1133 1133 void process(const Node& node) {} … … 1148 1148 struct Constraints { 1149 1149 void constraints() { 1150 1151 1152 1153 1154 1155 1150 Arc arc; 1151 Node node; 1152 visitor.discover(arc); 1153 visitor.reach(node); 1154 visitor.examine(arc); 1155 visitor.start(node); 1156 1156 visitor.process(node); 1157 1157 } … … 1168 1168 struct BfsVisitDefaultTraits { 1169 1169 1170 /// \brief The digraph type the algorithm runs on. 1170 /// \brief The digraph type the algorithm runs on. 1171 1171 typedef _Digraph Digraph; 1172 1172 1173 1173 /// \brief The type of the map that indicates which nodes are reached. 1174 /// 1174 /// 1175 1175 /// The type of the map that indicates which nodes are reached. 1176 1176 /// It must meet the \ref concepts::WriteMap "WriteMap" concept. … … 1180 1180 /// \brief Instantiates a ReachedMap. 1181 1181 /// 1182 /// This function instantiates a \ref ReachedMap. 1182 /// This function instantiates a \ref ReachedMap. 1183 1183 /// \param digraph is the digraph, to which 1184 1184 /// we would like to define the \ref ReachedMap. … … 1190 1190 1191 1191 /// \ingroup search 1192 /// 1192 /// 1193 1193 /// \brief %BFS Visit algorithm class. 1194 /// 1194 /// 1195 1195 /// This class provides an efficient implementation of the %BFS algorithm 1196 1196 /// with visitor interface. … … 1198 1198 /// The %BfsVisit class provides an alternative interface to the Bfs 1199 1199 /// class. It works with callback mechanism, the BfsVisit object calls 1200 /// on every bfs event the \c Visitor class member functions. 1200 /// on every bfs event the \c Visitor class member functions. 1201 1201 /// 1202 1202 /// \tparam _Digraph The digraph type the algorithm runs on. The default value is 1203 1203 /// \ref ListDigraph. The value of _Digraph is not used directly by Bfs, it 1204 1204 /// is only passed to \ref BfsDefaultTraits. 1205 /// \tparam _Visitor The Visitor object for the algorithm. The 1205 /// \tparam _Visitor The Visitor object for the algorithm. The 1206 1206 /// \ref BfsVisitor "BfsVisitor<_Digraph>" is an empty Visitor which 1207 1207 /// does not observe the Bfs events. If you want to observe the bfs 1208 1208 /// events you should implement your own Visitor class. 1209 /// \tparam _Traits Traits class to set various data types used by the 1209 /// \tparam _Traits Traits class to set various data types used by the 1210 1210 /// algorithm. The default traits class is 1211 1211 /// \ref BfsVisitDefaultTraits "BfsVisitDefaultTraits<_Digraph>". … … 1216 1216 #else 1217 1217 template <typename _Digraph = ListDigraph, 1218 1219 1218 typename _Visitor = BfsVisitor<_Digraph>, 1219 typename _Traits = BfsDefaultTraits<_Digraph> > 1220 1220 #endif 1221 1221 class BfsVisit { 1222 1222 public: 1223 1223 1224 1224 /// \brief \ref Exception for uninitialized parameters. 1225 1225 /// … … 1228 1228 class UninitializedParameter : public lemon::UninitializedParameter { 1229 1229 public: 1230 virtual const char* what() const throw() 1230 virtual const char* what() const throw() 1231 1231 { 1232 1232 return "lemon::BfsVisit::UninitializedParameter"; 1233 1233 } 1234 1234 }; … … 1267 1267 void create_maps() { 1268 1268 if(!_reached) { 1269 1270 1269 local_reached = true; 1270 _reached = Traits::createReachedMap(*_digraph); 1271 1271 } 1272 1272 } … … 1275 1275 1276 1276 BfsVisit() {} 1277 1277 1278 1278 public: 1279 1279 … … 1287 1287 typedef T ReachedMap; 1288 1288 static ReachedMap *createReachedMap(const Digraph &digraph) { 1289 1290 } 1291 }; 1292 /// \brief \ref named-templ-param "Named parameter" for setting 1289 throw UninitializedParameter(); 1290 } 1291 }; 1292 /// \brief \ref named-templ-param "Named parameter" for setting 1293 1293 /// ReachedMap type 1294 1294 /// … … 1296 1296 template <class T> 1297 1297 struct DefReachedMap : public BfsVisit< Digraph, Visitor, 1298 1298 DefReachedMapTraits<T> > { 1299 1299 typedef BfsVisit< Digraph, Visitor, DefReachedMapTraits<T> > Create; 1300 1300 }; 1301 1301 ///@} 1302 1302 1303 public: 1304 1303 public: 1304 1305 1305 /// \brief Constructor. 1306 1306 /// … … 1310 1310 /// \param visitor The visitor of the algorithm. 1311 1311 /// 1312 BfsVisit(const Digraph& digraph, Visitor& visitor) 1312 BfsVisit(const Digraph& digraph, Visitor& visitor) 1313 1313 : _digraph(&digraph), _visitor(&visitor), 1314 1315 1314 _reached(0), local_reached(false) {} 1315 1316 1316 /// \brief Destructor. 1317 1317 /// … … 1330 1330 BfsVisit &reachedMap(ReachedMap &m) { 1331 1331 if(local_reached) { 1332 1333 1332 delete _reached; 1333 local_reached = false; 1334 1334 } 1335 1335 _reached = &m; … … 1358 1358 _list_front = _list_back = -1; 1359 1359 for (NodeIt u(*_digraph) ; u != INVALID ; ++u) { 1360 1361 } 1362 } 1363 1360 _reached->set(u, false); 1361 } 1362 } 1363 1364 1364 /// \brief Adds a new source node. 1365 1365 /// … … 1367 1367 void addSource(Node s) { 1368 1368 if(!(*_reached)[s]) { 1369 1370 1371 1369 _reached->set(s,true); 1370 _visitor->start(s); 1371 _visitor->reach(s); 1372 1372 _list[++_list_back] = s; 1373 1374 } 1375 1373 } 1374 } 1375 1376 1376 /// \brief Processes the next node. 1377 1377 /// … … 1381 1381 /// 1382 1382 /// \pre The queue must not be empty! 1383 Node processNextNode() { 1383 Node processNextNode() { 1384 1384 Node n = _list[++_list_front]; 1385 1385 _visitor->process(n); … … 1468 1468 /// \return The next node to be processed or INVALID if the stack is 1469 1469 /// empty. 1470 Node nextNode() { 1470 Node nextNode() { 1471 1471 return _list_front != _list_back ? _list[_list_front + 1] : INVALID; 1472 1472 } … … 1483 1483 /// Returns the number of the nodes to be processed in the queue. 1484 1484 int queueSize() { return _list_back - _list_front; } 1485 1485 1486 1486 /// \brief Executes the algorithm. 1487 1487 /// … … 1493 1493 while ( !emptyQueue() ) processNextNode(); 1494 1494 } 1495 1495 1496 1496 /// \brief Executes the algorithm until \c dest is reached. 1497 1497 /// … … 1504 1504 while ( !emptyQueue() && !reach ) processNextNode(dest, reach); 1505 1505 } 1506 1506 1507 1507 /// \brief Executes the algorithm until a condition is met. 1508 1508 /// … … 1522 1522 Node rnode = INVALID; 1523 1523 while ( !emptyQueue() && rnode == INVALID ) { 1524 1524 processNextNode(nm, rnode); 1525 1525 } 1526 1526 return rnode; … … 1543 1543 1544 1544 /// \brief Runs %BFSVisit algorithm to visit all nodes in the digraph. 1545 /// 1545 /// 1546 1546 /// This method runs the %BFS algorithm in order to 1547 1547 /// compute the %BFS path to each node. The algorithm computes -
lemon/bin_heap.h
r157 r209 1 /* -*- C++-*-2 * 3 * This file is a part of LEMON, a generic C++ optimization library 1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 * 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 49 49 ///\sa Dijkstra 50 50 template <typename _Prio, typename _ItemIntMap, 51 51 typename _Compare = std::less<_Prio> > 52 52 class BinHeap { 53 53 … … 91 91 /// should be PRE_HEAP (-1) for each element. 92 92 explicit BinHeap(ItemIntMap &_iim) : iim(_iim) {} 93 93 94 94 /// \brief The constructor. 95 95 /// … … 100 100 /// 101 101 /// \param _comp The comparator function object. 102 BinHeap(ItemIntMap &_iim, const Compare &_comp) 102 BinHeap(ItemIntMap &_iim, const Compare &_comp) 103 103 : iim(_iim), comp(_comp) {} 104 104 … … 108 108 /// \brief Returns the number of items stored in the heap. 109 109 int size() const { return data.size(); } 110 110 111 111 /// \brief Checks if the heap stores no items. 112 112 /// … … 115 115 116 116 /// \brief Make empty this heap. 117 /// 117 /// 118 118 /// Make empty this heap. It does not change the cross reference map. 119 119 /// If you want to reuse what is not surely empty you should first clear 120 120 /// the heap and after that you should set the cross reference map for 121 121 /// each item to \c PRE_HEAP. 122 void clear() { 123 data.clear(); 122 void clear() { 123 data.clear(); 124 124 } 125 125 … … 135 135 int par = parent(hole); 136 136 while( hole>0 && less(p,data[par]) ) { 137 138 139 137 move(data[par],hole); 138 hole = par; 139 par = parent(hole); 140 140 } 141 141 move(p, hole); … … 146 146 int child = second_child(hole); 147 147 while(child < length) { 148 149 150 151 152 153 154 155 148 if( less(data[child-1], data[child]) ) { 149 --child; 150 } 151 if( !less(data[child], p) ) 152 goto ok; 153 move(data[child], hole); 154 hole = child; 155 child = second_child(hole); 156 156 } 157 157 child--; 158 158 if( child<length && less(data[child], p) ) { 159 160 159 move(data[child], hole); 160 hole=child; 161 161 } 162 162 ok: … … 182 182 183 183 /// \brief Insert an item into the heap with the given heap. 184 /// 185 /// Adds \c i to the heap with priority \c p. 184 /// 185 /// Adds \c i to the heap with priority \c p. 186 186 /// \param i The item to insert. 187 187 /// \param p The priority of the item. … … 191 191 /// 192 192 /// This method returns the item with minimum priority relative to \c 193 /// Compare. 194 /// \pre The heap must be nonempty. 193 /// Compare. 194 /// \pre The heap must be nonempty. 195 195 Item top() const { 196 196 return data[0].first; … … 208 208 /// 209 209 /// This method deletes the item with minimum priority relative to \c 210 /// Compare from the heap. 211 /// \pre The heap must be non-empty. 210 /// Compare from the heap. 211 /// \pre The heap must be non-empty. 212 212 void pop() { 213 213 int n = data.size()-1; 214 214 iim.set(data[0].first, POST_HEAP); 215 215 if (n > 0) { 216 216 bubble_down(0, data[n], n); 217 217 } 218 218 data.pop_back(); … … 229 229 iim.set(data[h].first, POST_HEAP); 230 230 if( h < n ) { 231 232 233 231 if ( bubble_up(h, data[n]) == h) { 232 bubble_down(h, data[n], n); 233 } 234 234 } 235 235 data.pop_back(); 236 236 } 237 237 238 238 239 239 /// \brief Returns the priority of \c i. 240 240 /// 241 /// This function returns the priority of item \c i. 241 /// This function returns the priority of item \c i. 242 242 /// \pre \c i must be in the heap. 243 243 /// \param i The item. … … 247 247 } 248 248 249 /// \brief \c i gets to the heap with priority \c p independently 249 /// \brief \c i gets to the heap with priority \c p independently 250 250 /// if \c i was already there. 251 251 /// … … 257 257 int idx = iim[i]; 258 258 if( idx < 0 ) { 259 259 push(i,p); 260 260 } 261 261 else if( comp(p, data[idx].second) ) { 262 262 bubble_up(idx, Pair(i,p)); 263 263 } 264 264 else { 265 265 bubble_down(idx, Pair(i,p), data.size()); 266 266 } 267 267 } … … 278 278 bubble_up(idx, Pair(i,p)); 279 279 } 280 280 281 281 /// \brief Increases the priority of \c i to \c p. 282 282 /// 283 /// This method sets the priority of item \c i to \c p. 283 /// This method sets the priority of item \c i to \c p. 284 284 /// \pre \c i must be stored in the heap with priority at most \c 285 285 /// p relative to \c Compare. … … 291 291 } 292 292 293 /// \brief Returns if \c item is in, has already been in, or has 293 /// \brief Returns if \c item is in, has already been in, or has 294 294 /// never been in the heap. 295 295 /// … … 302 302 int s = iim[i]; 303 303 if( s>=0 ) 304 304 s=0; 305 305 return State(s); 306 306 } … … 312 312 /// better time complexity. 313 313 /// \param i The item. 314 /// \param st The state. It should not be \c IN_HEAP. 314 /// \param st The state. It should not be \c IN_HEAP. 315 315 void state(const Item& i, State st) { 316 316 switch (st) { … … 341 341 342 342 }; // class BinHeap 343 343 344 344 } // namespace lemon 345 345 -
lemon/bits/alteration_notifier.h
r157 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 33 33 /// \ingroup graphbits 34 34 /// 35 /// \brief Notifier class to notify observes about alterations in 35 /// \brief Notifier class to notify observes about alterations in 36 36 /// a container. 37 37 /// … … 50 50 /// alteration of the graph. 51 51 /// 52 /// This class provides an interface to the container. The \e first() and \e 52 /// This class provides an interface to the container. The \e first() and \e 53 53 /// next() member functions make possible to iterate on the keys of the 54 54 /// container. The \e id() function returns an integer id for each key. … … 61 61 /// from the graph. If all items are erased from the graph or from an empty 62 62 /// graph a new graph is builded then it can be signaled with the 63 /// clear() and build() members. Important rule that if we erase items 63 /// clear() and build() members. Important rule that if we erase items 64 64 /// from graph we should first signal the alteration and after that erase 65 65 /// them from the container, on the other way on item addition we should … … 69 69 /// \e ObserverBase nested class. The signals can be handled with 70 70 /// overriding the virtual functions defined in the base class. The 71 /// observer base can be attached to the notifier with the 71 /// observer base can be attached to the notifier with the 72 72 /// \e attach() member and can be detached with detach() function. The 73 73 /// alteration handlers should not call any function which signals … … 80 80 /// be rolled back by calling the \e erase() or \e clear() 81 81 /// functions. Thence the \e erase() and \e clear() should not throw 82 /// exception. Actullay, it can be throw only 82 /// exception. Actullay, it can be throw only 83 83 /// \ref AlterationObserver::ImmediateDetach ImmediateDetach 84 84 /// exception which detach the observer from the notifier. … … 86 86 /// There are some place when the alteration observing is not completly 87 87 /// reliable. If we want to carry out the node degree in the graph 88 /// as in the \ref InDegMap and we use the reverseEdge that cause 88 /// as in the \ref InDegMap and we use the reverseEdge that cause 89 89 /// unreliable functionality. Because the alteration observing signals 90 90 /// only erasing and adding but not the reversing it will stores bad … … 105 105 typedef _Item Item; 106 106 107 /// \brief Exception which can be called from \e clear() and 107 /// \brief Exception which can be called from \e clear() and 108 108 /// \e erase(). 109 109 /// … … 128 128 /// The build() and clear() members are to notify the observer 129 129 /// about the container is built from an empty container or 130 /// is cleared to an empty container. 130 /// is cleared to an empty container. 131 131 132 132 class ObserverBase { … … 139 139 /// 140 140 /// Default constructor for ObserverBase. 141 /// 141 /// 142 142 ObserverBase() : _notifier(0) {} 143 143 … … 152 152 /// 153 153 /// Constructor which attach the obserever to the same notifier as 154 /// the other observer is attached to. 154 /// the other observer is attached to. 155 155 ObserverBase(const ObserverBase& copy) { 156 156 if (copy.attached()) { 157 157 attach(*copy.notifier()); 158 159 } 160 158 } 159 } 160 161 161 /// \brief Destructor 162 162 virtual ~ObserverBase() { … … 171 171 /// 172 172 void attach(AlterationNotifier& nf) { 173 174 } 175 173 nf.attach(*this); 174 } 175 176 176 /// \brief Detaches the observer into an AlterationNotifier. 177 177 /// … … 181 181 _notifier->detach(*this); 182 182 } 183 184 /// \brief Gives back a pointer to the notifier which the map 183 184 /// \brief Gives back a pointer to the notifier which the map 185 185 /// attached into. 186 186 /// … … 189 189 /// 190 190 Notifier* notifier() const { return const_cast<Notifier*>(_notifier); } 191 191 192 192 /// Gives back true when the observer is attached into a notifier. 193 193 bool attached() const { return _notifier != 0; } … … 198 198 199 199 protected: 200 200 201 201 Notifier* _notifier; 202 202 typename std::list<ObserverBase*>::iterator _index; … … 210 210 virtual void add(const Item&) = 0; 211 211 212 /// \brief The member function to notificate the observer about 212 /// \brief The member function to notificate the observer about 213 213 /// more item is added to the container. 214 214 /// … … 223 223 /// The erase() member function notificates the observer about an 224 224 /// item is erased from the container. It have to be overrided in 225 /// the subclasses. 225 /// the subclasses. 226 226 virtual void erase(const Item&) = 0; 227 227 228 /// \brief The member function to notificate the observer about 228 /// \brief The member function to notificate the observer about 229 229 /// more item is erased from the container. 230 230 /// … … 248 248 /// The clear() member function notificates the observer about all 249 249 /// items are erased from the container. It have to be overrided in 250 /// the subclasses. 250 /// the subclasses. 251 251 virtual void clear() = 0; 252 252 253 253 }; 254 254 255 255 protected: 256 256 257 257 const Container* container; 258 258 259 typedef std::list<ObserverBase*> Observers; 259 typedef std::list<ObserverBase*> Observers; 260 260 Observers _observers; 261 261 262 262 263 263 public: 264 264 265 265 /// \brief Default constructor. 266 266 /// 267 /// The default constructor of the AlterationNotifier. 267 /// The default constructor of the AlterationNotifier. 268 268 /// It creates an empty notifier. 269 AlterationNotifier() 269 AlterationNotifier() 270 270 : container(0) {} 271 271 … … 273 273 /// 274 274 /// Constructor with the observed container parameter. 275 AlterationNotifier(const Container& _container) 275 AlterationNotifier(const Container& _container) 276 276 : container(&_container) {} 277 277 278 /// \brief Copy Constructor of the AlterationNotifier. 279 /// 280 /// Copy constructor of the AlterationNotifier. 278 /// \brief Copy Constructor of the AlterationNotifier. 279 /// 280 /// Copy constructor of the AlterationNotifier. 281 281 /// It creates only an empty notifier because the copiable 282 282 /// notifier's observers have to be registered still into that notifier. 283 AlterationNotifier(const AlterationNotifier& _notifier) 283 AlterationNotifier(const AlterationNotifier& _notifier) 284 284 : container(_notifier.container) {} 285 285 286 286 /// \brief Destructor. 287 /// 287 /// 288 288 /// Destructor of the AlterationNotifier. 289 289 /// … … 291 291 typename Observers::iterator it; 292 292 for (it = _observers.begin(); it != _observers.end(); ++it) { 293 293 (*it)->_notifier = 0; 294 294 } 295 295 } … … 339 339 return container->maxId(Item()); 340 340 } 341 341 342 342 protected: 343 343 … … 345 345 observer._index = _observers.insert(_observers.begin(), &observer); 346 346 observer._notifier = this; 347 } 347 } 348 348 349 349 void detach(ObserverBase& observer) { … … 354 354 355 355 public: 356 357 /// \brief Notifies all the registed observers about an item added to 358 /// the container. 359 /// 360 /// It notifies all the registed observers about an item added to 361 /// the container. 362 /// 356 357 /// \brief Notifies all the registed observers about an item added to 358 /// the container. 359 /// 360 /// It notifies all the registed observers about an item added to 361 /// the container. 362 /// 363 363 void add(const Item& item) { 364 364 typename Observers::reverse_iterator it; … … 374 374 throw; 375 375 } 376 } 377 378 /// \brief Notifies all the registed observers about more item added to 379 /// the container. 380 /// 381 /// It notifies all the registed observers about more item added to 382 /// the container. 383 /// 376 } 377 378 /// \brief Notifies all the registed observers about more item added to 379 /// the container. 380 /// 381 /// It notifies all the registed observers about more item added to 382 /// the container. 383 /// 384 384 void add(const std::vector<Item>& items) { 385 385 typename Observers::reverse_iterator it; … … 395 395 throw; 396 396 } 397 } 398 399 /// \brief Notifies all the registed observers about an item erased from 400 /// the container. 401 /// 402 /// It notifies all the registed observers about an item erased from 403 /// the container. 404 /// 397 } 398 399 /// \brief Notifies all the registed observers about an item erased from 400 /// the container. 401 /// 402 /// It notifies all the registed observers about an item erased from 403 /// the container. 404 /// 405 405 void erase(const Item& item) throw() { 406 406 typename Observers::iterator it = _observers.begin(); … … 417 417 } 418 418 419 /// \brief Notifies all the registed observers about more item erased 419 /// \brief Notifies all the registed observers about more item erased 420 420 /// from the container. 421 /// 422 /// It notifies all the registed observers about more item erased from 423 /// the container. 424 /// 421 /// 422 /// It notifies all the registed observers about more item erased from 423 /// the container. 424 /// 425 425 void erase(const std::vector<Item>& items) { 426 426 typename Observers::iterator it = _observers.begin(); … … 437 437 } 438 438 439 /// \brief Notifies all the registed observers about the container is 439 /// \brief Notifies all the registed observers about the container is 440 440 /// built. 441 /// 441 /// 442 442 /// Notifies all the registed observers about the container is built 443 443 /// from an empty container. … … 457 457 } 458 458 459 /// \brief Notifies all the registed observers about all items are 459 /// \brief Notifies all the registed observers about all items are 460 460 /// erased. 461 461 /// -
lemon/bits/array_map.h
r107 r209 1 /* -*- C++-*-2 * 3 * This file is a part of LEMON, a generic C++ optimization library 1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 * 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 39 39 /// The ArrayMap template class is graph map structure what 40 40 /// automatically updates the map when a key is added to or erased from 41 /// the map. This map uses the allocators to implement 41 /// the map. This map uses the allocators to implement 42 42 /// the container functionality. 43 43 /// … … 45 45 /// the Value type of the map. 46 46 template <typename _Graph, typename _Item, typename _Value> 47 class ArrayMap 47 class ArrayMap 48 48 : public ItemSetTraits<_Graph, _Item>::ItemNotifier::ObserverBase { 49 49 public: 50 /// The graph type of the maps. 50 /// The graph type of the maps. 51 51 typedef _Graph Graph; 52 52 /// The item type of the map. … … 70 70 /// The MapBase of the Map which imlements the core regisitry function. 71 71 typedef typename Notifier::ObserverBase Parent; 72 72 73 73 private: 74 74 typedef std::allocator<Value> Allocator; … … 85 85 Item it; 86 86 for (nf->first(it); it != INVALID; nf->next(it)) { 87 88 89 } 90 } 91 92 /// \brief Constructor to use default value to initialize the map. 93 /// 94 /// It constructs a map and initialize all of the the map. 87 int id = nf->id(it);; 88 allocator.construct(&(values[id]), Value()); 89 } 90 } 91 92 /// \brief Constructor to use default value to initialize the map. 93 /// 94 /// It constructs a map and initialize all of the the map. 95 95 ArrayMap(const Graph& graph, const Value& value) { 96 96 Parent::attach(graph.notifier(Item())); … … 99 99 Item it; 100 100 for (nf->first(it); it != INVALID; nf->next(it)) { 101 102 103 } 101 int id = nf->id(it);; 102 allocator.construct(&(values[id]), value); 103 } 104 104 } 105 105 106 106 /// \brief Constructor to copy a map of the same map type. 107 107 /// 108 /// Constructor to copy a map of the same map type. 108 /// Constructor to copy a map of the same map type. 109 109 ArrayMap(const ArrayMap& copy) : Parent() { 110 110 if (copy.attached()) { 111 111 attach(*copy.notifier()); 112 112 } 113 113 capacity = copy.capacity; … … 117 117 Item it; 118 118 for (nf->first(it); it != INVALID; nf->next(it)) { 119 120 119 int id = nf->id(it);; 120 allocator.construct(&(values[id]), copy.values[id]); 121 121 } 122 122 } … … 125 125 /// 126 126 /// This operator assigns for each item in the map the 127 /// value mapped to the same item in the copied map. 127 /// value mapped to the same item in the copied map. 128 128 /// The parameter map should be indiced with the same 129 129 /// itemset because this assign operator does not change 130 /// the container of the map. 130 /// the container of the map. 131 131 ArrayMap& operator=(const ArrayMap& cmap) { 132 132 return operator=<ArrayMap>(cmap); … … 139 139 /// concecpt and could be indiced by the current item set of 140 140 /// the NodeMap. In this case the value for each item 141 /// is assigned by the value of the given ReadMap. 141 /// is assigned by the value of the given ReadMap. 142 142 template <typename CMap> 143 143 ArrayMap& operator=(const CMap& cmap) { … … 152 152 153 153 /// \brief The destructor of the map. 154 /// 154 /// 155 155 /// The destructor of the map. 156 virtual ~ArrayMap() { 156 virtual ~ArrayMap() { 157 157 if (attached()) { 158 159 160 } 161 } 162 158 clear(); 159 detach(); 160 } 161 } 162 163 163 protected: 164 164 … … 169 169 public: 170 170 171 /// \brief The subscript operator. 171 /// \brief The subscript operator. 172 172 /// 173 173 /// The subscript operator. The map can be subscripted by the 174 /// actual keys of the graph. 174 /// actual keys of the graph. 175 175 Value& operator[](const Key& key) { 176 176 int id = Parent::notifier()->id(key); 177 177 return values[id]; 178 } 179 178 } 179 180 180 /// \brief The const subscript operator. 181 181 /// 182 182 /// The const subscript operator. The map can be subscripted by the 183 /// actual keys of the graph. 183 /// actual keys of the graph. 184 184 const Value& operator[](const Key& key) const { 185 185 int id = Parent::notifier()->id(key); … … 188 188 189 189 /// \brief Setter function of the map. 190 /// 190 /// 191 191 /// Setter function of the map. Equivalent with map[key] = val. 192 192 /// This is a compatibility feature with the not dereferable maps. … … 198 198 199 199 /// \brief Adds a new key to the map. 200 /// 200 /// 201 201 /// It adds a new key to the map. It called by the observer notifier 202 /// and it overrides the add() member function of the observer base. 202 /// and it overrides the add() member function of the observer base. 203 203 virtual void add(const Key& key) { 204 204 Notifier* nf = Parent::notifier(); 205 205 int id = nf->id(key); 206 206 if (id >= capacity) { 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 207 int new_capacity = (capacity == 0 ? 1 : capacity); 208 while (new_capacity <= id) { 209 new_capacity <<= 1; 210 } 211 Value* new_values = allocator.allocate(new_capacity); 212 Item it; 213 for (nf->first(it); it != INVALID; nf->next(it)) { 214 int jd = nf->id(it);; 215 if (id != jd) { 216 allocator.construct(&(new_values[jd]), values[jd]); 217 allocator.destroy(&(values[jd])); 218 } 219 } 220 if (capacity != 0) allocator.deallocate(values, capacity); 221 values = new_values; 222 capacity = new_capacity; 223 223 } 224 224 allocator.construct(&(values[id]), Value()); … … 226 226 227 227 /// \brief Adds more new keys to the map. 228 /// 228 /// 229 229 /// It adds more new keys to the map. It called by the observer notifier 230 /// and it overrides the add() member function of the observer base. 230 /// and it overrides the add() member function of the observer base. 231 231 virtual void add(const std::vector<Key>& keys) { 232 232 Notifier* nf = Parent::notifier(); 233 233 int max_id = -1; 234 234 for (int i = 0; i < int(keys.size()); ++i) { 235 236 237 238 235 int id = nf->id(keys[i]); 236 if (id > max_id) { 237 max_id = id; 238 } 239 239 } 240 240 if (max_id >= capacity) { 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 241 int new_capacity = (capacity == 0 ? 1 : capacity); 242 while (new_capacity <= max_id) { 243 new_capacity <<= 1; 244 } 245 Value* new_values = allocator.allocate(new_capacity); 246 Item it; 247 for (nf->first(it); it != INVALID; nf->next(it)) { 248 int id = nf->id(it); 249 bool found = false; 250 for (int i = 0; i < int(keys.size()); ++i) { 251 int jd = nf->id(keys[i]); 252 if (id == jd) { 253 found = true; 254 break; 255 } 256 } 257 if (found) continue; 258 allocator.construct(&(new_values[id]), values[id]); 259 allocator.destroy(&(values[id])); 260 } 261 if (capacity != 0) allocator.deallocate(values, capacity); 262 values = new_values; 263 capacity = new_capacity; 264 264 } 265 265 for (int i = 0; i < int(keys.size()); ++i) { 266 267 268 } 269 } 270 266 int id = nf->id(keys[i]); 267 allocator.construct(&(values[id]), Value()); 268 } 269 } 270 271 271 /// \brief Erase a key from the map. 272 272 /// 273 273 /// Erase a key from the map. It called by the observer notifier 274 /// and it overrides the erase() member function of the observer base. 274 /// and it overrides the erase() member function of the observer base. 275 275 virtual void erase(const Key& key) { 276 276 int id = Parent::notifier()->id(key); … … 281 281 /// 282 282 /// Erase more keys from the map. It called by the observer notifier 283 /// and it overrides the erase() member function of the observer base. 283 /// and it overrides the erase() member function of the observer base. 284 284 virtual void erase(const std::vector<Key>& keys) { 285 285 for (int i = 0; i < int(keys.size()); ++i) { 286 287 286 int id = Parent::notifier()->id(keys[i]); 287 allocator.destroy(&(values[id])); 288 288 } 289 289 } 290 290 291 291 /// \brief Buildes the map. 292 /// 292 /// 293 293 /// It buildes the map. It called by the observer notifier 294 /// and it overrides the build() member function of the observer base. 294 /// and it overrides the build() member function of the observer base. 295 295 virtual void build() { 296 296 Notifier* nf = Parent::notifier(); … … 298 298 Item it; 299 299 for (nf->first(it); it != INVALID; nf->next(it)) { 300 301 302 } 300 int id = nf->id(it);; 301 allocator.construct(&(values[id]), Value()); 302 } 303 303 } 304 304 … … 306 306 /// 307 307 /// It erase all items from the map. It called by the observer notifier 308 /// and it overrides the clear() member function of the observer base. 309 virtual void clear() { 308 /// and it overrides the clear() member function of the observer base. 309 virtual void clear() { 310 310 Notifier* nf = Parent::notifier(); 311 311 if (capacity != 0) { 312 313 314 315 316 } 317 318 312 Item it; 313 for (nf->first(it); it != INVALID; nf->next(it)) { 314 int id = nf->id(it); 315 allocator.destroy(&(values[id])); 316 } 317 allocator.deallocate(values, capacity); 318 capacity = 0; 319 319 } 320 320 } 321 321 322 322 private: 323 323 324 324 void allocate_memory() { 325 325 int max_id = Parent::notifier()->maxId(); 326 326 if (max_id == -1) { 327 328 329 327 capacity = 0; 328 values = 0; 329 return; 330 330 } 331 331 capacity = 1; 332 332 while (capacity <= max_id) { 333 334 } 335 values = allocator.allocate(capacity); 336 } 333 capacity <<= 1; 334 } 335 values = allocator.allocate(capacity); 336 } 337 337 338 338 int capacity; … … 340 340 Allocator allocator; 341 341 342 }; 342 }; 343 343 344 344 } 345 345 346 #endif 346 #endif -
lemon/bits/base_extender.h
r107 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 64 64 65 65 bool operator==(const Arc &that) const { 66 66 return forward==that.forward && Edge(*this)==Edge(that); 67 67 } 68 68 bool operator!=(const Arc &that) const { 69 69 return forward!=that.forward || Edge(*this)!=Edge(that); 70 70 } 71 71 bool operator<(const Arc &that) const { 72 73 72 return forward<that.forward || 73 (!(that.forward<forward) && Edge(*this)<Edge(that)); 74 74 } 75 75 }; … … 118 118 void next(Arc &e) const { 119 119 if( e.forward ) { 120 120 e.forward = false; 121 121 } 122 122 else { 123 124 123 Parent::next(e); 124 e.forward = true; 125 125 } 126 126 } … … 129 129 Parent::firstIn(e,n); 130 130 if( Edge(e) != INVALID ) { 131 131 e.forward = false; 132 132 } 133 133 else { 134 135 134 Parent::firstOut(e,n); 135 e.forward = true; 136 136 } 137 137 } 138 138 void nextOut(Arc &e) const { 139 139 if( ! e.forward ) { 140 141 142 143 144 145 140 Node n = Parent::target(e); 141 Parent::nextIn(e); 142 if( Edge(e) == INVALID ) { 143 Parent::firstOut(e, n); 144 e.forward = true; 145 } 146 146 } 147 147 else { 148 148 Parent::nextOut(e); 149 149 } 150 150 } … … 153 153 Parent::firstOut(e,n); 154 154 if( Edge(e) != INVALID ) { 155 155 e.forward = false; 156 156 } 157 157 else { 158 159 158 Parent::firstIn(e,n); 159 e.forward = true; 160 160 } 161 161 } 162 162 void nextIn(Arc &e) const { 163 163 if( ! e.forward ) { 164 165 166 167 168 169 164 Node n = Parent::source(e); 165 Parent::nextOut(e); 166 if( Edge(e) == INVALID ) { 167 Parent::firstIn(e, n); 168 e.forward = true; 169 } 170 170 } 171 171 else { 172 172 Parent::nextIn(e); 173 173 } 174 174 } … … 184 184 void nextInc(Edge &e, bool &d) const { 185 185 if (d) { 186 187 188 189 190 191 } else { 192 186 Node s = Parent::source(e); 187 Parent::nextOut(e); 188 if (e != INVALID) return; 189 d = false; 190 Parent::firstIn(e, s); 191 } else { 192 Parent::nextIn(e); 193 193 } 194 194 } … … 241 241 Arc findArc(Node s, Node t, Arc p = INVALID) const { 242 242 if (p == INVALID) { 243 244 245 246 243 Edge arc = Parent::findArc(s, t); 244 if (arc != INVALID) return direct(arc, true); 245 arc = Parent::findArc(t, s); 246 if (arc != INVALID) return direct(arc, false); 247 247 } else if (direction(p)) { 248 249 250 251 if (arc != INVALID) return direct(arc, false); 252 } else { 253 254 if (arc != INVALID) return direct(arc, false); 248 Edge arc = Parent::findArc(s, t, p); 249 if (arc != INVALID) return direct(arc, true); 250 arc = Parent::findArc(t, s); 251 if (arc != INVALID) return direct(arc, false); 252 } else { 253 Edge arc = Parent::findArc(t, s, p); 254 if (arc != INVALID) return direct(arc, false); 255 255 } 256 256 return INVALID; … … 268 268 if (arc != INVALID) return arc; 269 269 arc = Parent::findArc(t, s); 270 if (arc != INVALID) return arc; 270 if (arc != INVALID) return arc; 271 271 } else { 272 272 Edge arc = Parent::findArc(t, s, p); 273 if (arc != INVALID) return arc; 273 if (arc != INVALID) return arc; 274 274 } 275 275 } else { … … 300 300 Red() {} 301 301 Red(const Node& node) : Node(node) { 302 LEMON_ASSERT(Parent::red(node) || node == INVALID, 303 302 LEMON_ASSERT(Parent::red(node) || node == INVALID, 303 typename Parent::NodeSetError()); 304 304 } 305 305 Red& operator=(const Node& node) { 306 LEMON_ASSERT(Parent::red(node) || node == INVALID, 307 306 LEMON_ASSERT(Parent::red(node) || node == INVALID, 307 typename Parent::NodeSetError()); 308 308 Node::operator=(node); 309 309 return *this; … … 332 332 Blue() {} 333 333 Blue(const Node& node) : Node(node) { 334 335 334 LEMON_ASSERT(Parent::blue(node) || node == INVALID, 335 typename Parent::NodeSetError()); 336 336 } 337 337 Blue& operator=(const Node& node) { 338 LEMON_ASSERT(Parent::blue(node) || node == INVALID, 339 338 LEMON_ASSERT(Parent::blue(node) || node == INVALID, 339 typename Parent::NodeSetError()); 340 340 Node::operator=(node); 341 341 return *this; … … 354 354 Parent::nextBlue(static_cast<Node&>(node)); 355 355 } 356 356 357 357 int id(const Blue& node) const { 358 358 return Parent::redId(node); … … 368 368 void firstInc(Edge& arc, bool& dir, const Node& node) const { 369 369 if (Parent::red(node)) { 370 371 372 } else { 373 374 370 Parent::firstFromRed(arc, node); 371 dir = true; 372 } else { 373 Parent::firstFromBlue(arc, node); 374 dir = static_cast<Edge&>(arc) == INVALID; 375 375 } 376 376 } 377 377 void nextInc(Edge& arc, bool& dir) const { 378 378 if (dir) { 379 380 } else { 381 382 379 Parent::nextFromRed(arc); 380 } else { 381 Parent::nextFromBlue(arc); 382 if (arc == INVALID) dir = true; 383 383 } 384 384 } … … 390 390 391 391 Arc(const Edge& arc, bool _forward) 392 392 : Edge(arc), forward(_forward) {} 393 393 394 394 public: … … 396 396 Arc (Invalid) : Edge(INVALID), forward(true) {} 397 397 bool operator==(const Arc& i) const { 398 398 return Edge::operator==(i) && forward == i.forward; 399 399 } 400 400 bool operator!=(const Arc& i) const { 401 401 return Edge::operator!=(i) || forward != i.forward; 402 402 } 403 403 bool operator<(const Arc& i) const { 404 return Edge::operator<(i) || 405 404 return Edge::operator<(i) || 405 (!(i.forward<forward) && Edge(*this)<Edge(i)); 406 406 } 407 407 }; … … 414 414 void next(Arc& arc) const { 415 415 if (!arc.forward) { 416 416 Parent::next(static_cast<Edge&>(arc)); 417 417 } 418 418 arc.forward = !arc.forward; … … 421 421 void firstOut(Arc& arc, const Node& node) const { 422 422 if (Parent::red(node)) { 423 424 425 } else { 426 427 423 Parent::firstFromRed(arc, node); 424 arc.forward = true; 425 } else { 426 Parent::firstFromBlue(arc, node); 427 arc.forward = static_cast<Edge&>(arc) == INVALID; 428 428 } 429 429 } 430 430 void nextOut(Arc& arc) const { 431 431 if (arc.forward) { 432 433 } else { 434 432 Parent::nextFromRed(arc); 433 } else { 434 Parent::nextFromBlue(arc); 435 435 arc.forward = static_cast<Edge&>(arc) == INVALID; 436 436 } … … 439 439 void firstIn(Arc& arc, const Node& node) const { 440 440 if (Parent::blue(node)) { 441 442 arc.forward = true; 443 } else { 444 445 441 Parent::firstFromBlue(arc, node); 442 arc.forward = true; 443 } else { 444 Parent::firstFromRed(arc, node); 445 arc.forward = static_cast<Edge&>(arc) == INVALID; 446 446 } 447 447 } 448 448 void nextIn(Arc& arc) const { 449 449 if (arc.forward) { 450 451 } else { 452 453 450 Parent::nextFromBlue(arc); 451 } else { 452 Parent::nextFromRed(arc); 453 arc.forward = static_cast<Edge&>(arc) == INVALID; 454 454 } 455 455 } … … 463 463 464 464 int id(const Arc& arc) const { 465 return (Parent::id(static_cast<const Edge&>(arc)) << 1) + 465 return (Parent::id(static_cast<const Edge&>(arc)) << 1) + 466 466 (arc.forward ? 0 : 1); 467 467 } -
lemon/bits/bezier.h
r184 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 45 45 Bezier1() {} 46 46 Bezier1(Point _p1, Point _p2) :p1(_p1), p2(_p2) {} 47 47 48 48 Point operator()(double t) const 49 49 { … … 55 55 return Bezier1(p1,conv(p1,p2,t)); 56 56 } 57 57 58 58 Bezier1 after(double t) const 59 59 { … … 88 88 return Bezier2(p1,q,conv(q,r,t)); 89 89 } 90 90 91 91 Bezier2 after(double t) const 92 92 { … … 111 111 Bezier3(Point _p1, Point _p2, Point _p3, Point _p4) 112 112 : p1(_p1), p2(_p2), p3(_p3), p4(_p4) {} 113 Bezier3(const Bezier1 &b) : p1(b.p1), p2(conv(b.p1,b.p2,1.0/3.0)), 114 113 Bezier3(const Bezier1 &b) : p1(b.p1), p2(conv(b.p1,b.p2,1.0/3.0)), 114 p3(conv(b.p1,b.p2,2.0/3.0)), p4(b.p2) {} 115 115 Bezier3(const Bezier2 &b) : p1(b.p1), p2(conv(b.p1,b.p2,2.0/3.0)), 116 117 118 Point operator()(double t) const 116 p3(conv(b.p2,b.p3,1.0/3.0)), p4(b.p3) {} 117 118 Point operator()(double t) const 119 119 { 120 120 // return Bezier2(conv(p1,p2,t),conv(p2,p3,t),conv(p3,p4,t))(t); 121 121 return ((1-t)*(1-t)*(1-t))*p1+(3*t*(1-t)*(1-t))*p2+ 122 122 (3*t*t*(1-t))*p3+(t*t*t)*p4; 123 123 } 124 124 Bezier3 before(double t) const … … 132 132 return Bezier3(p1,p,a,c); 133 133 } 134 134 135 135 Bezier3 after(double t) const 136 136 { … … 147 147 Bezier2 grad() const { return Bezier2(3.0*(p2-p1),3.0*(p3-p2),3.0*(p4-p3)); } 148 148 Bezier2 norm() const { return Bezier2(3.0*rot90(p2-p1), 149 150 149 3.0*rot90(p3-p2), 150 3.0*rot90(p4-p3)); } 151 151 Point grad(double t) const { return grad()(t); } 152 152 Point norm(double t) const { return rot90(grad(t)); } 153 153 154 154 template<class R,class F,class S,class D> 155 R recSplit(F &_f,const S &_s,D _d) const 155 R recSplit(F &_f,const S &_s,D _d) const 156 156 { 157 157 const Point a=(p1+p2)/2; … … 165 165 return _s(f1,f2); 166 166 } 167 167 168 168 }; 169 169 -
lemon/bits/default_map.h
r107 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 30 30 31 31 namespace lemon { 32 33 32 33 34 34 //#ifndef LEMON_USE_DEBUG_MAP 35 35 … … 141 141 }; 142 142 143 // #else 143 // #else 144 144 145 145 // template <typename _Graph, typename _Item, typename _Value> … … 148 148 // }; 149 149 150 // #endif 150 // #endif 151 151 152 152 /// \e 153 153 template <typename _Graph, typename _Item, typename _Value> 154 class DefaultMap 154 class DefaultMap 155 155 : public DefaultMapSelector<_Graph, _Item, _Value>::Map { 156 156 public: 157 157 typedef typename DefaultMapSelector<_Graph, _Item, _Value>::Map Parent; 158 158 typedef DefaultMap<_Graph, _Item, _Value> Map; 159 159 160 160 typedef typename Parent::Graph Graph; 161 161 typedef typename Parent::Value Value; 162 162 163 163 explicit DefaultMap(const Graph& graph) : Parent(graph) {} 164 DefaultMap(const Graph& graph, const Value& value) 164 DefaultMap(const Graph& graph, const Value& value) 165 165 : Parent(graph, value) {} 166 166 -
lemon/bits/graph_extender.h
r125 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 67 67 Node oppositeNode(const Node &node, const Arc &arc) const { 68 68 if (node == Parent::source(arc)) 69 69 return Parent::target(arc); 70 70 else if(node == Parent::target(arc)) 71 71 return Parent::source(arc); 72 72 else 73 73 return INVALID; 74 74 } 75 75 … … 90 90 return node_notifier; 91 91 } 92 92 93 93 ArcNotifier& notifier(Arc) const { 94 94 return arc_notifier; 95 95 } 96 96 97 class NodeIt : public Node { 97 class NodeIt : public Node { 98 98 const Digraph* _digraph; 99 99 public: … … 104 104 105 105 explicit NodeIt(const Digraph& digraph) : _digraph(&digraph) { 106 107 } 108 109 NodeIt(const Digraph& digraph, const Node& node) 110 111 112 NodeIt& operator++() { 113 114 return *this; 115 } 116 117 }; 118 119 120 class ArcIt : public Arc { 106 _digraph->first(static_cast<Node&>(*this)); 107 } 108 109 NodeIt(const Digraph& digraph, const Node& node) 110 : Node(node), _digraph(&digraph) {} 111 112 NodeIt& operator++() { 113 _digraph->next(*this); 114 return *this; 115 } 116 117 }; 118 119 120 class ArcIt : public Arc { 121 121 const Digraph* _digraph; 122 122 public: … … 127 127 128 128 explicit ArcIt(const Digraph& digraph) : _digraph(&digraph) { 129 130 } 131 132 ArcIt(const Digraph& digraph, const Arc& arc) : 133 134 135 ArcIt& operator++() { 136 137 return *this; 138 } 139 140 }; 141 142 143 class OutArcIt : public Arc { 129 _digraph->first(static_cast<Arc&>(*this)); 130 } 131 132 ArcIt(const Digraph& digraph, const Arc& arc) : 133 Arc(arc), _digraph(&digraph) { } 134 135 ArcIt& operator++() { 136 _digraph->next(*this); 137 return *this; 138 } 139 140 }; 141 142 143 class OutArcIt : public Arc { 144 144 const Digraph* _digraph; 145 145 public: … … 149 149 OutArcIt(Invalid i) : Arc(i) { } 150 150 151 OutArcIt(const Digraph& digraph, const Node& node) 152 153 154 } 155 156 OutArcIt(const Digraph& digraph, const Arc& arc) 157 158 159 OutArcIt& operator++() { 160 161 return *this; 162 } 163 164 }; 165 166 167 class InArcIt : public Arc { 151 OutArcIt(const Digraph& digraph, const Node& node) 152 : _digraph(&digraph) { 153 _digraph->firstOut(*this, node); 154 } 155 156 OutArcIt(const Digraph& digraph, const Arc& arc) 157 : Arc(arc), _digraph(&digraph) {} 158 159 OutArcIt& operator++() { 160 _digraph->nextOut(*this); 161 return *this; 162 } 163 164 }; 165 166 167 class InArcIt : public Arc { 168 168 const Digraph* _digraph; 169 169 public: … … 173 173 InArcIt(Invalid i) : Arc(i) { } 174 174 175 InArcIt(const Digraph& digraph, const Node& node) 176 177 178 } 179 180 InArcIt(const Digraph& digraph, const Arc& arc) : 181 182 183 InArcIt& operator++() { 184 185 return *this; 175 InArcIt(const Digraph& digraph, const Node& node) 176 : _digraph(&digraph) { 177 _digraph->firstIn(*this, node); 178 } 179 180 InArcIt(const Digraph& digraph, const Arc& arc) : 181 Arc(arc), _digraph(&digraph) {} 182 183 InArcIt& operator++() { 184 _digraph->nextIn(*this); 185 return *this; 186 186 } 187 187 … … 216 216 } 217 217 218 218 219 219 template <typename _Value> 220 class NodeMap 220 class NodeMap 221 221 : public MapExtender<DefaultMap<Digraph, Node, _Value> > { 222 222 public: … … 224 224 typedef MapExtender<DefaultMap<Digraph, Node, _Value> > Parent; 225 225 226 explicit NodeMap(const Digraph& digraph) 227 228 NodeMap(const Digraph& digraph, const _Value& value) 229 226 explicit NodeMap(const Digraph& digraph) 227 : Parent(digraph) {} 228 NodeMap(const Digraph& digraph, const _Value& value) 229 : Parent(digraph, value) {} 230 230 231 231 NodeMap& operator=(const NodeMap& cmap) { 232 232 return operator=<NodeMap>(cmap); 233 233 } 234 234 … … 236 236 NodeMap& operator=(const CMap& cmap) { 237 237 Parent::operator=(cmap); 238 238 return *this; 239 239 } 240 240 … … 242 242 243 243 template <typename _Value> 244 class ArcMap 244 class ArcMap 245 245 : public MapExtender<DefaultMap<Digraph, Arc, _Value> > { 246 246 public: … … 248 248 typedef MapExtender<DefaultMap<Digraph, Arc, _Value> > Parent; 249 249 250 explicit ArcMap(const Digraph& digraph) 251 252 ArcMap(const Digraph& digraph, const _Value& value) 253 250 explicit ArcMap(const Digraph& digraph) 251 : Parent(digraph) {} 252 ArcMap(const Digraph& digraph, const _Value& value) 253 : Parent(digraph, value) {} 254 254 255 255 ArcMap& operator=(const ArcMap& cmap) { 256 256 return operator=<ArcMap>(cmap); 257 257 } 258 258 … … 260 260 ArcMap& operator=(const CMap& cmap) { 261 261 Parent::operator=(cmap); 262 262 return *this; 263 263 } 264 264 }; … … 270 270 return node; 271 271 } 272 272 273 273 Arc addArc(const Node& from, const Node& to) { 274 274 Arc arc = Parent::addArc(from, to); … … 294 294 Parent::firstOut(arc, node); 295 295 while (arc != INVALID ) { 296 297 298 } 296 erase(arc); 297 Parent::firstOut(arc, node); 298 } 299 299 300 300 Parent::firstIn(arc, node); 301 301 while (arc != INVALID ) { 302 303 302 erase(arc); 303 Parent::firstIn(arc, node); 304 304 } 305 305 … … 307 307 Parent::erase(node); 308 308 } 309 309 310 310 void erase(const Arc& arc) { 311 311 notifier(Arc()).erase(arc); … … 316 316 node_notifier.setContainer(*this); 317 317 arc_notifier.setContainer(*this); 318 } 319 318 } 319 320 320 321 321 ~DigraphExtender() { … … 328 328 /// 329 329 /// \brief Extender for the Graphs 330 template <typename Base> 330 template <typename Base> 331 331 class GraphExtender : public Base { 332 332 public: 333 333 334 334 typedef Base Parent; 335 335 typedef GraphExtender Graph; … … 341 341 typedef typename Parent::Edge Edge; 342 342 343 // Graph extension 343 // Graph extension 344 344 345 345 int maxId(Node) const { … … 369 369 Node oppositeNode(const Node &n, const Edge &e) const { 370 370 if( n == Parent::u(e)) 371 371 return Parent::v(e); 372 372 else if( n == Parent::v(e)) 373 373 return Parent::u(e); 374 374 else 375 375 return INVALID; 376 376 } 377 377 … … 403 403 return node_notifier; 404 404 } 405 405 406 406 ArcNotifier& notifier(Arc) const { 407 407 return arc_notifier; … … 414 414 415 415 416 class NodeIt : public Node { 416 class NodeIt : public Node { 417 417 const Graph* _graph; 418 418 public: … … 423 423 424 424 explicit NodeIt(const Graph& graph) : _graph(&graph) { 425 426 } 427 428 NodeIt(const Graph& graph, const Node& node) 429 430 431 NodeIt& operator++() { 432 433 return *this; 434 } 435 436 }; 437 438 439 class ArcIt : public Arc { 425 _graph->first(static_cast<Node&>(*this)); 426 } 427 428 NodeIt(const Graph& graph, const Node& node) 429 : Node(node), _graph(&graph) {} 430 431 NodeIt& operator++() { 432 _graph->next(*this); 433 return *this; 434 } 435 436 }; 437 438 439 class ArcIt : public Arc { 440 440 const Graph* _graph; 441 441 public: … … 446 446 447 447 explicit ArcIt(const Graph& graph) : _graph(&graph) { 448 449 } 450 451 ArcIt(const Graph& graph, const Arc& arc) : 452 453 454 ArcIt& operator++() { 455 456 return *this; 457 } 458 459 }; 460 461 462 class OutArcIt : public Arc { 448 _graph->first(static_cast<Arc&>(*this)); 449 } 450 451 ArcIt(const Graph& graph, const Arc& arc) : 452 Arc(arc), _graph(&graph) { } 453 454 ArcIt& operator++() { 455 _graph->next(*this); 456 return *this; 457 } 458 459 }; 460 461 462 class OutArcIt : public Arc { 463 463 const Graph* _graph; 464 464 public: … … 468 468 OutArcIt(Invalid i) : Arc(i) { } 469 469 470 OutArcIt(const Graph& graph, const Node& node) 471 472 473 } 474 475 OutArcIt(const Graph& graph, const Arc& arc) 476 477 478 OutArcIt& operator++() { 479 480 return *this; 481 } 482 483 }; 484 485 486 class InArcIt : public Arc { 470 OutArcIt(const Graph& graph, const Node& node) 471 : _graph(&graph) { 472 _graph->firstOut(*this, node); 473 } 474 475 OutArcIt(const Graph& graph, const Arc& arc) 476 : Arc(arc), _graph(&graph) {} 477 478 OutArcIt& operator++() { 479 _graph->nextOut(*this); 480 return *this; 481 } 482 483 }; 484 485 486 class InArcIt : public Arc { 487 487 const Graph* _graph; 488 488 public: … … 492 492 InArcIt(Invalid i) : Arc(i) { } 493 493 494 InArcIt(const Graph& graph, const Node& node) 495 496 497 } 498 499 InArcIt(const Graph& graph, const Arc& arc) : 500 501 502 InArcIt& operator++() { 503 504 return *this; 505 } 506 507 }; 508 509 510 class EdgeIt : public Parent::Edge { 494 InArcIt(const Graph& graph, const Node& node) 495 : _graph(&graph) { 496 _graph->firstIn(*this, node); 497 } 498 499 InArcIt(const Graph& graph, const Arc& arc) : 500 Arc(arc), _graph(&graph) {} 501 502 InArcIt& operator++() { 503 _graph->nextIn(*this); 504 return *this; 505 } 506 507 }; 508 509 510 class EdgeIt : public Parent::Edge { 511 511 const Graph* _graph; 512 512 public: … … 517 517 518 518 explicit EdgeIt(const Graph& graph) : _graph(&graph) { 519 520 } 521 522 EdgeIt(const Graph& graph, const Edge& edge) : 523 524 525 EdgeIt& operator++() { 526 527 return *this; 519 _graph->first(static_cast<Edge&>(*this)); 520 } 521 522 EdgeIt(const Graph& graph, const Edge& edge) : 523 Edge(edge), _graph(&graph) { } 524 525 EdgeIt& operator++() { 526 _graph->next(*this); 527 return *this; 528 528 } 529 529 … … 541 541 542 542 IncEdgeIt(const Graph& graph, const Node &node) : _graph(&graph) { 543 543 _graph->firstInc(*this, _direction, node); 544 544 } 545 545 546 546 IncEdgeIt(const Graph& graph, const Edge &edge, const Node &node) 547 548 547 : _graph(&graph), Edge(edge) { 548 _direction = (_graph->source(edge) == node); 549 549 } 550 550 551 551 IncEdgeIt& operator++() { 552 553 return *this; 552 _graph->nextInc(*this, _direction); 553 return *this; 554 554 } 555 555 }; … … 599 599 600 600 template <typename _Value> 601 class NodeMap 601 class NodeMap 602 602 : public MapExtender<DefaultMap<Graph, Node, _Value> > { 603 603 public: … … 605 605 typedef MapExtender<DefaultMap<Graph, Node, _Value> > Parent; 606 606 607 NodeMap(const Graph& graph) 608 609 NodeMap(const Graph& graph, const _Value& value) 610 607 NodeMap(const Graph& graph) 608 : Parent(graph) {} 609 NodeMap(const Graph& graph, const _Value& value) 610 : Parent(graph, value) {} 611 611 612 612 NodeMap& operator=(const NodeMap& cmap) { 613 613 return operator=<NodeMap>(cmap); 614 614 } 615 615 … … 617 617 NodeMap& operator=(const CMap& cmap) { 618 618 Parent::operator=(cmap); 619 619 return *this; 620 620 } 621 621 … … 623 623 624 624 template <typename _Value> 625 class ArcMap 625 class ArcMap 626 626 : public MapExtender<DefaultMap<Graph, Arc, _Value> > { 627 627 public: … … 629 629 typedef MapExtender<DefaultMap<Graph, Arc, _Value> > Parent; 630 630 631 ArcMap(const Graph& graph) 632 633 ArcMap(const Graph& graph, const _Value& value) 634 631 ArcMap(const Graph& graph) 632 : Parent(graph) {} 633 ArcMap(const Graph& graph, const _Value& value) 634 : Parent(graph, value) {} 635 635 636 636 ArcMap& operator=(const ArcMap& cmap) { 637 637 return operator=<ArcMap>(cmap); 638 638 } 639 639 … … 641 641 ArcMap& operator=(const CMap& cmap) { 642 642 Parent::operator=(cmap); 643 643 return *this; 644 644 } 645 645 }; … … 647 647 648 648 template <typename _Value> 649 class EdgeMap 649 class EdgeMap 650 650 : public MapExtender<DefaultMap<Graph, Edge, _Value> > { 651 651 public: … … 653 653 typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent; 654 654 655 EdgeMap(const Graph& graph) 656 657 658 EdgeMap(const Graph& graph, const _Value& value) 659 655 EdgeMap(const Graph& graph) 656 : Parent(graph) {} 657 658 EdgeMap(const Graph& graph, const _Value& value) 659 : Parent(graph, value) {} 660 660 661 661 EdgeMap& operator=(const EdgeMap& cmap) { 662 662 return operator=<EdgeMap>(cmap); 663 663 } 664 664 … … 666 666 EdgeMap& operator=(const CMap& cmap) { 667 667 Parent::operator=(cmap); 668 668 return *this; 669 669 } 670 670 … … 684 684 std::vector<Arc> ev; 685 685 ev.push_back(Parent::direct(edge, true)); 686 ev.push_back(Parent::direct(edge, false)); 686 ev.push_back(Parent::direct(edge, false)); 687 687 notifier(Arc()).add(ev); 688 688 return edge; 689 689 } 690 690 691 691 void clear() { 692 692 notifier(Arc()).clear(); … … 697 697 698 698 template <typename Graph, typename NodeRefMap, typename EdgeRefMap> 699 void build(const Graph& graph, NodeRefMap& nodeRef, 699 void build(const Graph& graph, NodeRefMap& nodeRef, 700 700 EdgeRefMap& edgeRef) { 701 701 Parent::build(graph, nodeRef, edgeRef); … … 709 709 Parent::firstOut(arc, node); 710 710 while (arc != INVALID ) { 711 712 713 } 711 erase(arc); 712 Parent::firstOut(arc, node); 713 } 714 714 715 715 Parent::firstIn(arc, node); 716 716 while (arc != INVALID ) { 717 718 717 erase(arc); 718 Parent::firstIn(arc, node); 719 719 } 720 720 … … 726 726 std::vector<Arc> av; 727 727 av.push_back(Parent::direct(edge, true)); 728 av.push_back(Parent::direct(edge, false)); 728 av.push_back(Parent::direct(edge, false)); 729 729 notifier(Arc()).erase(av); 730 730 notifier(Edge()).erase(edge); … … 733 733 734 734 GraphExtender() { 735 node_notifier.setContainer(*this); 735 node_notifier.setContainer(*this); 736 736 arc_notifier.setContainer(*this); 737 737 edge_notifier.setContainer(*this); 738 } 738 } 739 739 740 740 ~GraphExtender() { 741 741 edge_notifier.clear(); 742 742 arc_notifier.clear(); 743 node_notifier.clear(); 744 } 743 node_notifier.clear(); 744 } 745 745 746 746 }; -
lemon/bits/invalid.h
r49 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 35 35 bool operator< (Invalid) { return false; } 36 36 }; 37 37 38 38 /// \brief Invalid iterators. 39 39 /// … … 53 53 54 54 #endif 55 55 -
lemon/bits/map_extender.h
r107 r209 1 /* -*- C++-*-2 * 3 * This file is a part of LEMON, a generic C++ optimization library 1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 * 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 33 33 34 34 /// \ingroup graphbits 35 /// 35 /// 36 36 /// \brief Extender for maps 37 37 template <typename _Map> … … 57 57 public: 58 58 59 MapExtender(const Graph& graph) 59 MapExtender(const Graph& graph) 60 60 : Parent(graph) {} 61 61 62 MapExtender(const Graph& graph, const Value& value) 62 MapExtender(const Graph& graph, const Value& value) 63 63 : Parent(graph, value) {} 64 64 … … 71 71 Parent::operator=(cmap); 72 72 return *this; 73 } 73 } 74 74 75 75 class MapIt : public Item { 76 76 public: 77 77 78 78 typedef Item Parent; 79 79 typedef typename Map::Value Value; 80 80 81 81 MapIt() {} 82 82 … … 87 87 } 88 88 89 MapIt(const Map& _map, const Item& item) 90 91 92 MapIt& operator++() { 93 94 return *this; 95 } 96 89 MapIt(const Map& _map, const Item& item) 90 : Parent(item), map(_map) {} 91 92 MapIt& operator++() { 93 map.notifier()->next(*this); 94 return *this; 95 } 96 97 97 typename MapTraits<Map>::ConstReturnValue operator*() const { 98 98 return map[*this]; 99 99 } 100 100 101 101 typename MapTraits<Map>::ReturnValue operator*() { 102 103 } 104 102 return map[*this]; 103 } 104 105 105 void set(const Value& value) { 106 107 } 108 106 map.set(*this, value); 107 } 108 109 109 protected: 110 110 Map& map; 111 111 112 112 }; 113 113 … … 118 118 119 119 typedef typename Map::Value Value; 120 120 121 121 ConstMapIt() {} 122 122 … … 127 127 } 128 128 129 ConstMapIt(const Map& _map, const Item& item) 130 131 132 ConstMapIt& operator++() { 133 134 return *this; 129 ConstMapIt(const Map& _map, const Item& item) 130 : Parent(item), map(_map) {} 131 132 ConstMapIt& operator++() { 133 map.notifier()->next(*this); 134 return *this; 135 135 } 136 136 137 137 typename MapTraits<Map>::ConstReturnValue operator*() const { 138 138 return map[*this]; 139 139 } 140 140 … … 145 145 class ItemIt : public Item { 146 146 public: 147 148 typedef Item Parent; 149 147 148 typedef Item Parent; 149 150 150 ItemIt() {} 151 151 … … 156 156 } 157 157 158 ItemIt(const Map& _map, const Item& item) 159 160 161 ItemIt& operator++() { 162 163 return *this; 158 ItemIt(const Map& _map, const Item& item) 159 : Parent(item), map(_map) {} 160 161 ItemIt& operator++() { 162 map.notifier()->next(*this); 163 return *this; 164 164 } 165 165 166 166 protected: 167 167 const Map& map; 168 168 169 169 }; 170 170 }; 171 171 172 172 /// \ingroup graphbits 173 /// 173 /// 174 174 /// \brief Extender for maps which use a subset of the items. 175 175 template <typename _Graph, typename _Map> … … 195 195 public: 196 196 197 SubMapExtender(const Graph& _graph) 197 SubMapExtender(const Graph& _graph) 198 198 : Parent(_graph), graph(_graph) {} 199 199 200 SubMapExtender(const Graph& _graph, const Value& _value) 200 SubMapExtender(const Graph& _graph, const Value& _value) 201 201 : Parent(_graph, _value), graph(_graph) {} 202 202 … … 213 213 } 214 214 return *this; 215 } 215 } 216 216 217 217 class MapIt : public Item { 218 218 public: 219 219 220 220 typedef Item Parent; 221 221 typedef typename Map::Value Value; 222 222 223 223 MapIt() {} 224 224 … … 229 229 } 230 230 231 MapIt(const Map& _map, const Item& item) 232 233 234 MapIt& operator++() { 235 236 return *this; 237 } 238 231 MapIt(const Map& _map, const Item& item) 232 : Parent(item), map(_map) {} 233 234 MapIt& operator++() { 235 map.graph.next(*this); 236 return *this; 237 } 238 239 239 typename MapTraits<Map>::ConstReturnValue operator*() const { 240 240 return map[*this]; 241 241 } 242 242 243 243 typename MapTraits<Map>::ReturnValue operator*() { 244 245 } 246 244 return map[*this]; 245 } 246 247 247 void set(const Value& value) { 248 249 } 250 248 map.set(*this, value); 249 } 250 251 251 protected: 252 252 Map& map; 253 253 254 254 }; 255 255 … … 260 260 261 261 typedef typename Map::Value Value; 262 262 263 263 ConstMapIt() {} 264 264 … … 269 269 } 270 270 271 ConstMapIt(const Map& _map, const Item& item) 272 273 274 ConstMapIt& operator++() { 275 276 return *this; 271 ConstMapIt(const Map& _map, const Item& item) 272 : Parent(item), map(_map) {} 273 274 ConstMapIt& operator++() { 275 map.graph.next(*this); 276 return *this; 277 277 } 278 278 279 279 typename MapTraits<Map>::ConstReturnValue operator*() const { 280 280 return map[*this]; 281 281 } 282 282 … … 287 287 class ItemIt : public Item { 288 288 public: 289 290 typedef Item Parent; 291 289 290 typedef Item Parent; 291 292 292 ItemIt() {} 293 293 … … 298 298 } 299 299 300 ItemIt(const Map& _map, const Item& item) 301 302 303 ItemIt& operator++() { 304 305 return *this; 300 ItemIt(const Map& _map, const Item& item) 301 : Parent(item), map(_map) {} 302 303 ItemIt& operator++() { 304 map.graph.next(*this); 305 return *this; 306 306 } 307 307 308 308 protected: 309 309 const Map& map; 310 311 }; 312 310 311 }; 312 313 313 private: 314 314 315 315 const Graph& graph; 316 316 317 317 }; 318 318 -
lemon/bits/path_dump.h
r100 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 54 54 RevArcIt() {} 55 55 RevArcIt(Invalid) : path(0), current(INVALID) {} 56 RevArcIt(const PredMapPath& _path) 56 RevArcIt(const PredMapPath& _path) 57 57 : path(&_path), current(_path.target) { 58 58 if (path->predMap[current] == INVALID) current = INVALID; … … 69 69 } 70 70 71 bool operator==(const RevArcIt& e) const { 72 return current == e.current; 71 bool operator==(const RevArcIt& e) const { 72 return current == e.current; 73 73 } 74 74 75 75 bool operator!=(const RevArcIt& e) const { 76 return current != e.current; 76 return current != e.current; 77 77 } 78 78 79 bool operator<(const RevArcIt& e) const { 80 return current < e.current; 79 bool operator<(const RevArcIt& e) const { 80 return current < e.current; 81 81 } 82 82 83 83 private: 84 84 const PredMapPath* path; … … 102 102 typedef _PredMatrixMap PredMatrixMap; 103 103 104 PredMatrixMapPath(const Digraph& _digraph, 104 PredMatrixMapPath(const Digraph& _digraph, 105 105 const PredMatrixMap& _predMatrixMap, 106 typename Digraph::Node _source, 106 typename Digraph::Node _source, 107 107 typename Digraph::Node _target) 108 : digraph(_digraph), predMatrixMap(_predMatrixMap), 108 : digraph(_digraph), predMatrixMap(_predMatrixMap), 109 109 source(_source), target(_target) {} 110 110 … … 128 128 RevArcIt() {} 129 129 RevArcIt(Invalid) : path(0), current(INVALID) {} 130 RevArcIt(const PredMatrixMapPath& _path) 130 RevArcIt(const PredMatrixMapPath& _path) 131 131 : path(&_path), current(_path.target) { 132 if (path->predMatrixMap(path->source, current) == INVALID) 132 if (path->predMatrixMap(path->source, current) == INVALID) 133 133 current = INVALID; 134 134 } … … 139 139 140 140 RevArcIt& operator++() { 141 current = 141 current = 142 142 path->digraph.source(path->predMatrixMap(path->source, current)); 143 if (path->predMatrixMap(path->source, current) == INVALID) 143 if (path->predMatrixMap(path->source, current) == INVALID) 144 144 current = INVALID; 145 145 return *this; 146 146 } 147 147 148 bool operator==(const RevArcIt& e) const { 149 return current == e.current; 148 bool operator==(const RevArcIt& e) const { 149 return current == e.current; 150 150 } 151 151 152 152 bool operator!=(const RevArcIt& e) const { 153 return current != e.current; 153 &nbs