Changes in / [1164:04f57dad1b07:1173:57167d92e96c] in lemon-main
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/dimacs.h
r1092 r1160 26 26 #include <lemon/maps.h> 27 27 #include <lemon/error.h> 28 28 29 /// \ingroup dimacs_group 29 30 /// \file … … 123 124 /// 124 125 /// If the file type was previously evaluated by dimacsType(), then 125 /// the descriptor struct should be given by the \c des tparameter.126 /// the descriptor struct should be given by the \c desc parameter. 126 127 template <typename Digraph, typename LowerMap, 127 128 typename CapacityMap, typename CostMap, … … 277 278 /// 278 279 /// If the file type was previously evaluated by dimacsType(), then 279 /// the descriptor struct should be given by the \c des tparameter.280 /// the descriptor struct should be given by the \c desc parameter. 280 281 template<typename Digraph, typename CapacityMap> 281 282 void readDimacsMax(std::istream& is, … … 304 305 /// 305 306 /// If the file type was previously evaluated by dimacsType(), then 306 /// the descriptor struct should be given by the \c des tparameter.307 /// the descriptor struct should be given by the \c desc parameter. 307 308 template<typename Digraph, typename LengthMap> 308 309 void readDimacsSp(std::istream& is, … … 335 336 /// 336 337 /// If the file type was previously evaluated by dimacsType(), then 337 /// the descriptor struct should be given by the \c des tparameter.338 /// the descriptor struct should be given by the \c desc parameter. 338 339 template<typename Digraph, typename CapacityMap> 339 340 void readDimacsCap(std::istream& is, … … 344 345 typename Digraph::Node u,v; 345 346 if(desc.type==DimacsDescriptor::NONE) desc=dimacsType(is); 346 if(desc.type!=DimacsDescriptor::MAX ||desc.type!=DimacsDescriptor::SP)347 if(desc.type!=DimacsDescriptor::MAX && desc.type!=DimacsDescriptor::SP) 347 348 throw FormatError("Problem type mismatch"); 348 349 _readDimacs(is, g, capacity, u, v, infty, desc); … … 375 376 /// 376 377 /// If the file type was previously evaluated by dimacsType(), then 377 /// the descriptor struct should be given by the \c des tparameter.378 /// the descriptor struct should be given by the \c desc parameter. 378 379 template<typename Graph> 379 380 void readDimacsMat(std::istream& is, Graph &g, -
lemon/lgf_reader.h
r1150 r1161 452 452 /// 453 453 ///\code 454 /// DigraphReader<DGR>(digraph, std::cin) .455 /// nodeMap("coordinates", coord_map).456 /// arcMap("capacity", cap_map).457 /// node("source", src).458 /// node("target", trg).459 /// attribute("caption", caption).460 /// run();454 /// DigraphReader<DGR>(digraph, std::cin) 455 /// .nodeMap("coordinates", coord_map) 456 /// .arcMap("capacity", cap_map) 457 /// .node("source", src) 458 /// .node("target", trg) 459 /// .attribute("caption", caption) 460 /// .run(); 461 461 ///\endcode 462 462 /// … … 1247 1247 ///ListDigraph::ArcMap<int> cap(digraph); 1248 1248 ///ListDigraph::Node src, trg; 1249 ///digraphReader(digraph, std::cin) .1250 /// arcMap("capacity", cap).1251 /// node("source", src).1252 /// node("target", trg).1253 /// run();1249 ///digraphReader(digraph, std::cin) 1250 /// .arcMap("capacity", cap) 1251 /// .node("source", src) 1252 /// .node("target", trg) 1253 /// .run(); 1254 1254 ///\endcode 1255 1255 /// … … 2124 2124 ///ListGraph graph; 2125 2125 ///ListGraph::EdgeMap<int> weight(graph); 2126 ///graphReader(graph, std::cin) .2127 /// edgeMap("weight", weight).2128 /// run();2126 ///graphReader(graph, std::cin) 2127 /// .edgeMap("weight", weight) 2128 /// .run(); 2129 2129 ///\endcode 2130 2130 /// … … 3192 3192 ///ListBpGraph graph; 3193 3193 ///ListBpGraph::EdgeMap<int> weight(graph); 3194 ///bpGraphReader(graph, std::cin) .3195 /// edgeMap("weight", weight).3196 /// run();3194 ///bpGraphReader(graph, std::cin) 3195 /// .edgeMap("weight", weight) 3196 /// .run(); 3197 3197 ///\endcode 3198 3198 /// -
lemon/lgf_writer.h
r1092 r1161 409 409 /// 410 410 ///\code 411 /// DigraphWriter<DGR>(digraph, std::cout) .412 /// nodeMap("coordinates", coord_map).413 /// nodeMap("size", size).414 /// nodeMap("title", title).415 /// arcMap("capacity", cap_map).416 /// node("source", src).417 /// node("target", trg).418 /// attribute("caption", caption).419 /// run();411 /// DigraphWriter<DGR>(digraph, std::cout) 412 /// .nodeMap("coordinates", coord_map) 413 /// .nodeMap("size", size) 414 /// .nodeMap("title", title) 415 /// .arcMap("capacity", cap_map) 416 /// .node("source", src) 417 /// .node("target", trg) 418 /// .attribute("caption", caption) 419 /// .run(); 420 420 ///\endcode 421 421 /// … … 962 962 ///ListDigraph::Node src, trg; 963 963 /// // Setting the capacity map and source and target nodes 964 ///digraphWriter(digraph, std::cout) .965 /// arcMap("capacity", cap).966 /// node("source", src).967 /// node("target", trg).968 /// run();964 ///digraphWriter(digraph, std::cout) 965 /// .arcMap("capacity", cap) 966 /// .node("source", src) 967 /// .node("target", trg) 968 /// .run(); 969 969 ///\endcode 970 970 /// … … 1600 1600 ///ListGraph::EdgeMap<int> weight(graph); 1601 1601 /// // Setting the weight map 1602 ///graphWriter(graph, std::cout) .1603 /// edgeMap("weight", weight).1604 /// run();1602 ///graphWriter(graph, std::cout) 1603 /// .edgeMap("weight", weight) 1604 /// .run(); 1605 1605 ///\endcode 1606 1606 /// … … 2420 2420 ///ListBpGraph::EdgeMap<int> weight(graph); 2421 2421 /// // Setting the weight map 2422 ///bpGraphWriter(graph, std::cout) .2423 /// edgeMap("weight", weight).2424 /// run();2422 ///bpGraphWriter(graph, std::cout) 2423 /// .edgeMap("weight", weight) 2424 /// .run(); 2425 2425 ///\endcode 2426 2426 /// -
lemon/preflow.h
r1092 r1169 477 477 /// flow to the given \c flowMap. The \c flowMap should contain a 478 478 /// flow or at least a preflow, i.e. at each node excluding the 479 /// source node the incoming flow should greater or equal to the479 /// source node the incoming flow should be greater or equal to the 480 480 /// outgoing flow. 481 481 /// \return \c false if the given \c flowMap is not a preflow. … … 496 496 excess -= (*_flow)[e]; 497 497 } 498 if ( excess < 0&& n != _source) return false;498 if (_tolerance.negative(excess) && n != _source) return false; 499 499 (*_excess)[n] = excess; 500 500 } … … 640 640 (*_excess)[n] = excess; 641 641 642 if ( excess != 0) {642 if (_tolerance.nonZero(excess)) { 643 643 if (new_level + 1 < _level->maxLevel()) { 644 644 _level->liftHighestActive(new_level + 1); … … 721 721 (*_excess)[n] = excess; 722 722 723 if ( excess != 0) {723 if (_tolerance.nonZero(excess)) { 724 724 if (new_level + 1 < _level->maxLevel()) { 725 725 _level->liftActiveOn(level, new_level + 1); … … 792 792 if (!reached[n]) { 793 793 _level->dirtyTopButOne(n); 794 } else if ( (*_excess)[n] > 0&& _target != n) {794 } else if (_tolerance.positive((*_excess)[n]) && _target != n) { 795 795 _level->activate(n); 796 796 } … … 853 853 (*_excess)[n] = excess; 854 854 855 if ( excess != 0) {855 if (_tolerance.nonZero(excess)) { 856 856 if (new_level + 1 < _level->maxLevel()) { 857 857 _level->liftHighestActive(new_level + 1); -
lemon/static_graph.h
r1124 r1157 30 30 31 31 class StaticDigraphBase { 32 32 33 public: 33 34 … … 297 298 /// \sa concepts::Digraph 298 299 class StaticDigraph : public ExtendedStaticDigraphBase { 300 301 private: 302 /// Graphs are \e not copy constructible. Use DigraphCopy instead. 303 StaticDigraph(const StaticDigraph &) : ExtendedStaticDigraphBase() {}; 304 /// \brief Assignment of a graph to another one is \e not allowed. 305 /// Use DigraphCopy instead. 306 void operator=(const StaticDigraph&) {} 307 299 308 public: 300 309 -
lemon/vf2.h
r1152 r1156 27 27 #include <lemon/dfs.h> 28 28 #include <lemon/bfs.h> 29 #include <test/test_tools.h>30 29 31 30 #include <vector> -
test/bellman_ford_test.cc
r1131 r1162 101 101 pp = const_bf_test.negativeCycle(); 102 102 103 #ifdef LEMON_CXX11 103 104 for (BF::ActiveIt it(const_bf_test); it != INVALID; ++it) {} 104 105 for (auto n: const_bf_test.activeNodes()) { ::lemon::ignore_unused_variable_warning(n); } … … 106 107 ::lemon::ignore_unused_variable_warning(n); 107 108 } 109 #endif 108 110 } 109 111 { -
test/max_flow_test.cc
r1092 r1169 27 27 #include <lemon/lgf_reader.h> 28 28 #include <lemon/elevator.h> 29 #include <lemon/tolerance.h> 29 30 30 31 using namespace lemon; … … 66 67 "target 8\n"; 67 68 69 char test_lgf_float[] = 70 "@nodes\n" 71 "label\n" 72 "0\n" 73 "1\n" 74 "2\n" 75 "3\n" 76 "4\n" 77 "5\n" 78 "6\n" 79 "7\n" 80 "8\n" 81 "9\n" 82 "@arcs\n" 83 " capacity\n" 84 "0 1 0.1\n" 85 "0 2 0.1\n" 86 "0 3 0.1\n" 87 "1 4 0.1\n" 88 "2 4 0.1\n" 89 "3 4 0.1\n" 90 "4 5 0.3\n" 91 "5 6 0.1\n" 92 "5 7 0.1\n" 93 "5 8 0.1\n" 94 "6 9 0.1\n" 95 "7 9 0.1\n" 96 "8 9 0.1\n" 97 "@attributes\n" 98 "source 0\n" 99 "target 9\n"; 68 100 69 101 // Checks the general interface of a max flow algorithm … … 166 198 typedef concepts::Digraph Digraph; 167 199 typedef concepts::ReadMap<Digraph::Arc, Value> CapMap; 168 typedef Elevator<Digraph, Digraph::Node> Elev;169 typedef LinkedElevator<Digraph, Digraph::Node> LinkedElev;170 200 171 201 Digraph g; … … 185 215 186 216 template <typename T> 187 T cutValue 188 189 190 191 T c =0;192 for (SmartDigraph::ArcIt e(g); e!=INVALID; ++e) {193 if (cut[g.source(e)] && !cut[g.target(e)]) c +=cap[e];217 T cutValue(const SmartDigraph& g, 218 const SmartDigraph::NodeMap<bool>& cut, 219 const SmartDigraph::ArcMap<T>& cap) { 220 221 T c = 0; 222 for (SmartDigraph::ArcIt e(g); e != INVALID; ++e) { 223 if (cut[g.source(e)] && !cut[g.target(e)]) c += cap[e]; 194 224 } 195 225 return c; … … 200 230 const SmartDigraph::ArcMap<T>& flow, 201 231 const SmartDigraph::ArcMap<T>& cap, 202 SmartDigraph::Node s, SmartDigraph::Node t) { 232 SmartDigraph::Node s, SmartDigraph::Node t, 233 const Tolerance<T>& tol) { 203 234 204 235 for (SmartDigraph::ArcIt e(g); e != INVALID; ++e) { 205 if ( flow[e] < 0 || flow[e] > cap[e]) return false;236 if (tol.negative(flow[e]) || tol.less(cap[e], flow[e])) return false; 206 237 } 207 238 … … 215 246 sum -= flow[e]; 216 247 } 217 if ( sum != 0) return false;248 if (tol.nonZero(sum)) return false; 218 249 } 219 250 return true; 220 251 } 221 252 222 void initFlowTest()253 void checkInitPreflow() 223 254 { 224 255 DIGRAPH_TYPEDEFS(SmartDigraph); 225 256 226 257 SmartDigraph g; 227 SmartDigraph::ArcMap<int> cap(g), iflow(g);228 Node s =g.addNode(); Node t=g.addNode();229 Node n1 =g.addNode(); Node n2=g.addNode();258 SmartDigraph::ArcMap<int> cap(g), iflow(g); 259 Node s = g.addNode(); Node t = g.addNode(); 260 Node n1 = g.addNode(); Node n2 = g.addNode(); 230 261 Arc a; 231 a =g.addArc(s,n1); cap[a]=20; iflow[a]=20;232 a =g.addArc(n1,n2); cap[a]=10; iflow[a]=0;233 a =g.addArc(n2,t); cap[a]=20; iflow[a]=0;234 235 Preflow<SmartDigraph> pre(g, cap,s,t);262 a = g.addArc(s, n1); cap[a] = 20; iflow[a] = 20; 263 a = g.addArc(n1, n2); cap[a] = 10; iflow[a] = 0; 264 a = g.addArc(n2, t); cap[a] = 20; iflow[a] = 0; 265 266 Preflow<SmartDigraph> pre(g, cap, s, t); 236 267 pre.init(iflow); 237 268 pre.startFirstPhase(); 238 check(pre.flowValue() == 10, "The incorrect max flow value."); 269 270 check(pre.flowValue() == 10, "Incorrect max flow value."); 239 271 check(pre.minCut(s), "Wrong min cut (Node s)."); 240 272 check(pre.minCut(n1), "Wrong min cut (Node n1)."); … … 244 276 245 277 template <typename MF, typename SF> 246 void checkMaxFlowAlg( ) {278 void checkMaxFlowAlg(const char *input_lgf, typename MF::Value expected) { 247 279 typedef SmartDigraph Digraph; 248 280 DIGRAPH_TYPEDEFS(Digraph); … … 253 285 typedef BoolNodeMap CutMap; 254 286 287 Tolerance<Value> tol; 288 255 289 Digraph g; 256 290 Node s, t; 257 291 CapMap cap(g); 258 std::istringstream input( test_lgf);259 DigraphReader<Digraph>(g, input)292 std::istringstream input(input_lgf); 293 DigraphReader<Digraph>(g, input) 260 294 .arcMap("capacity", cap) 261 .node("source", s)262 .node("target", t)295 .node("source", s) 296 .node("target", t) 263 297 .run(); 264 298 … … 266 300 max_flow.run(); 267 301 268 check(checkFlow(g, max_flow.flowMap(), cap, s, t), 302 check(!tol.different(expected, max_flow.flowValue()), 303 "Incorrect max flow value."); 304 check(checkFlow(g, max_flow.flowMap(), cap, s, t, tol), 269 305 "The flow is not feasible."); 270 306 … … 273 309 Value min_cut_value = cutValue(g, min_cut, cap); 274 310 275 check( max_flow.flowValue() == min_cut_value,276 " The max flow value is not equal to themin cut value.");311 check(!tol.different(expected, min_cut_value), 312 "Incorrect min cut value."); 277 313 278 314 FlowMap flow(g); 279 for (ArcIt e(g); e != INVALID; ++e) flow[e] = max_flow.flowMap()[e]; 280 281 Value flow_value = max_flow.flowValue(); 282 283 for (ArcIt e(g); e != INVALID; ++e) cap[e] = 2 * cap[e]; 315 for (ArcIt e(g); e != INVALID; ++e) flow[e] = 13 * max_flow.flowMap()[e]; 316 for (ArcIt e(g); e != INVALID; ++e) cap[e] = 17 * cap[e]; 284 317 max_flow.init(flow); 285 318 … … 290 323 min_cut_value = cutValue(g, min_cut1, cap); 291 324 292 check(max_flow.flowValue() == min_cut_value && 293 min_cut_value == 2 * flow_value, 294 "The max flow value or the min cut value is wrong."); 325 check(!tol.different(17 * expected, max_flow.flowValue()), 326 "Incorrect max flow value."); 327 check(!tol.different(17 * expected, min_cut_value), 328 "Incorrect min cut value."); 295 329 296 330 SF::startSecondPhase(max_flow); // start second phase of the algorithm 297 331 298 check(checkFlow(g, max_flow.flowMap(), cap, s, t ),332 check(checkFlow(g, max_flow.flowMap(), cap, s, t, tol), 299 333 "The flow is not feasible."); 300 334 … … 303 337 min_cut_value = cutValue(g, min_cut2, cap); 304 338 305 check( max_flow.flowValue() == min_cut_value &&306 min_cut_value == 2 * flow_value,307 "The max flow value or the min cut value was not doubled");308 339 check(!tol.different(17 * expected, max_flow.flowValue()), 340 "Incorrect max flow value."); 341 check(!tol.different(17 * expected, min_cut_value), 342 "Incorrect min cut value."); 309 343 310 344 max_flow.flowMap(flow); … … 325 359 CutMap min_cut3(g); 326 360 max_flow.minCutMap(min_cut3); 327 min_cut_value =cutValue(g, min_cut3, cap);328 329 check( max_flow.flowValue() == min_cut_value,361 min_cut_value = cutValue(g, min_cut3, cap); 362 363 check(!tol.different(max_flow.flowValue(), min_cut_value), 330 364 "The max flow value or the min cut value is wrong."); 331 365 } … … 380 414 typedef Preflow<SmartDigraph, SmartDigraph::ArcMap<int> > PType1; 381 415 typedef Preflow<SmartDigraph, SmartDigraph::ArcMap<float> > PType2; 382 checkMaxFlowAlg<PType1, PreflowStartFunctions<PType1> >(); 383 checkMaxFlowAlg<PType2, PreflowStartFunctions<PType2> >(); 384 initFlowTest(); 416 typedef Preflow<SmartDigraph, SmartDigraph::ArcMap<double> > PType3; 417 418 checkMaxFlowAlg<PType1, PreflowStartFunctions<PType1> >(test_lgf, 13); 419 checkMaxFlowAlg<PType2, PreflowStartFunctions<PType2> >(test_lgf, 13); 420 checkMaxFlowAlg<PType3, PreflowStartFunctions<PType3> >(test_lgf, 13); 421 422 checkMaxFlowAlg<PType2, PreflowStartFunctions<PType2> >(test_lgf_float, 0.3); 423 checkMaxFlowAlg<PType3, PreflowStartFunctions<PType3> >(test_lgf_float, 0.3); 424 425 checkInitPreflow(); 385 426 386 427 // Check EdmondsKarp 387 428 typedef EdmondsKarp<SmartDigraph, SmartDigraph::ArcMap<int> > EKType1; 388 429 typedef EdmondsKarp<SmartDigraph, SmartDigraph::ArcMap<float> > EKType2; 389 checkMaxFlowAlg<EKType1, GeneralStartFunctions<EKType1> >(); 390 checkMaxFlowAlg<EKType2, GeneralStartFunctions<EKType2> >(); 391 392 initFlowTest(); 430 typedef EdmondsKarp<SmartDigraph, SmartDigraph::ArcMap<double> > EKType3; 431 432 checkMaxFlowAlg<EKType1, GeneralStartFunctions<EKType1> >(test_lgf, 13); 433 checkMaxFlowAlg<EKType2, GeneralStartFunctions<EKType2> >(test_lgf, 13); 434 checkMaxFlowAlg<EKType3, GeneralStartFunctions<EKType3> >(test_lgf, 13); 435 436 checkMaxFlowAlg<EKType2, GeneralStartFunctions<EKType2> >(test_lgf_float, 0.3); 437 checkMaxFlowAlg<EKType3, GeneralStartFunctions<EKType3> >(test_lgf_float, 0.3); 393 438 394 439 return 0; -
tools/dimacs-solver.cc
r1093 r1170 223 223 throw IoError("Cannot open the file for writing", ap.files()[1]); 224 224 } 225 // fall through 225 226 case 1: 226 227 input.open(ap.files()[0].c_str()); … … 228 229 throw IoError("File cannot be found", ap.files()[0]); 229 230 } 231 // fall through 230 232 case 0: 231 233 break; … … 252 254 case DimacsDescriptor::SP: 253 255 std::cout << "sp"; 256 break; 254 257 case DimacsDescriptor::MAT: 255 258 std::cout << "mat";
Note: See TracChangeset
for help on using the changeset viewer.