# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1521741301 -3600
# Thu Mar 22 18:55:01 2018 +0100
# Node ID e0ccc1f0268f086456eb14044fcbaaaf11824dd2
# Parent dceba191c00dbe9bb4867fab619aac7a9c232ae9
Remove unused typedefs in max_flow_test.cc (#608)
diff --git a/test/max_flow_test.cc b/test/max_flow_test.cc
|
a
|
b
|
|
| 165 | 165 | typedef int Value; |
| 166 | 166 | typedef concepts::Digraph Digraph; |
| 167 | 167 | typedef concepts::ReadMap<Digraph::Arc, Value> CapMap; |
| 168 | | typedef Elevator<Digraph, Digraph::Node> Elev; |
| 169 | | typedef LinkedElevator<Digraph, Digraph::Node> LinkedElev; |
| 170 | 168 | |
| 171 | 169 | Digraph g; |
| 172 | 170 | Digraph::Node n; |
# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1521741331 -3600
# Thu Mar 22 18:55:31 2018 +0100
# Node ID e2732b9da429ccdd732e43e62c580640a36af15e
# Parent e0ccc1f0268f086456eb14044fcbaaaf11824dd2
Refactoring and code formatting in max_flow_test.cc (#608)
diff --git a/test/max_flow_test.cc b/test/max_flow_test.cc
|
a
|
b
|
|
| 182 | 182 | |
| 183 | 183 | |
| 184 | 184 | template <typename T> |
| 185 | | T cutValue (const SmartDigraph& g, |
| 186 | | const SmartDigraph::NodeMap<bool>& cut, |
| 187 | | const SmartDigraph::ArcMap<T>& cap) { |
| | 185 | T cutValue(const SmartDigraph& g, |
| | 186 | const SmartDigraph::NodeMap<bool>& cut, |
| | 187 | const SmartDigraph::ArcMap<T>& cap) { |
| 188 | 188 | |
| 189 | | T c=0; |
| 190 | | for(SmartDigraph::ArcIt e(g); e!=INVALID; ++e) { |
| 191 | | if (cut[g.source(e)] && !cut[g.target(e)]) c+=cap[e]; |
| | 189 | T c = 0; |
| | 190 | for (SmartDigraph::ArcIt e(g); e != INVALID; ++e) { |
| | 191 | if (cut[g.source(e)] && !cut[g.target(e)]) c += cap[e]; |
| 192 | 192 | } |
| 193 | 193 | return c; |
| 194 | 194 | } |
| … |
… |
|
| 217 | 217 | return true; |
| 218 | 218 | } |
| 219 | 219 | |
| 220 | | void initFlowTest() |
| | 220 | void checkInitPreflow() |
| 221 | 221 | { |
| 222 | 222 | DIGRAPH_TYPEDEFS(SmartDigraph); |
| 223 | 223 | |
| 224 | 224 | SmartDigraph g; |
| 225 | | SmartDigraph::ArcMap<int> cap(g),iflow(g); |
| 226 | | Node s=g.addNode(); Node t=g.addNode(); |
| 227 | | Node n1=g.addNode(); Node n2=g.addNode(); |
| | 225 | SmartDigraph::ArcMap<int> cap(g), iflow(g); |
| | 226 | Node s = g.addNode(); Node t = g.addNode(); |
| | 227 | Node n1 = g.addNode(); Node n2 = g.addNode(); |
| 228 | 228 | Arc a; |
| 229 | | a=g.addArc(s,n1); cap[a]=20; iflow[a]=20; |
| 230 | | a=g.addArc(n1,n2); cap[a]=10; iflow[a]=0; |
| 231 | | a=g.addArc(n2,t); cap[a]=20; iflow[a]=0; |
| | 229 | a = g.addArc(s, n1); cap[a] = 20; iflow[a] = 20; |
| | 230 | a = g.addArc(n1, n2); cap[a] = 10; iflow[a] = 0; |
| | 231 | a = g.addArc(n2, t); cap[a] = 20; iflow[a] = 0; |
| 232 | 232 | |
| 233 | | Preflow<SmartDigraph> pre(g,cap,s,t); |
| | 233 | Preflow<SmartDigraph> pre(g, cap, s, t); |
| 234 | 234 | pre.init(iflow); |
| 235 | 235 | pre.startFirstPhase(); |
| 236 | | check(pre.flowValue() == 10, "The incorrect max flow value."); |
| | 236 | |
| | 237 | check(pre.flowValue() == 10, "Incorrect max flow value."); |
| 237 | 238 | check(pre.minCut(s), "Wrong min cut (Node s)."); |
| 238 | 239 | check(pre.minCut(n1), "Wrong min cut (Node n1)."); |
| 239 | 240 | check(!pre.minCut(n2), "Wrong min cut (Node n2)."); |
| … |
… |
|
| 302 | 303 | |
| 303 | 304 | check(max_flow.flowValue() == min_cut_value && |
| 304 | 305 | min_cut_value == 2 * flow_value, |
| 305 | | "The max flow value or the min cut value was not doubled"); |
| 306 | | |
| | 306 | "The max flow value or the min cut value was not doubled."); |
| 307 | 307 | |
| 308 | 308 | max_flow.flowMap(flow); |
| 309 | 309 | |
| … |
… |
|
| 322 | 322 | |
| 323 | 323 | CutMap min_cut3(g); |
| 324 | 324 | max_flow.minCutMap(min_cut3); |
| 325 | | min_cut_value=cutValue(g, min_cut3, cap); |
| | 325 | min_cut_value = cutValue(g, min_cut3, cap); |
| 326 | 326 | |
| 327 | 327 | check(max_flow.flowValue() == min_cut_value, |
| 328 | 328 | "The max flow value or the min cut value is wrong."); |
| … |
… |
|
| 379 | 379 | typedef Preflow<SmartDigraph, SmartDigraph::ArcMap<float> > PType2; |
| 380 | 380 | checkMaxFlowAlg<PType1, PreflowStartFunctions<PType1> >(); |
| 381 | 381 | checkMaxFlowAlg<PType2, PreflowStartFunctions<PType2> >(); |
| 382 | | initFlowTest(); |
| | 382 | |
| | 383 | checkInitPreflow(); |
| 383 | 384 | |
| 384 | 385 | // Check EdmondsKarp |
| 385 | 386 | typedef EdmondsKarp<SmartDigraph, SmartDigraph::ArcMap<int> > EKType1; |
| … |
… |
|
| 387 | 388 | checkMaxFlowAlg<EKType1, GeneralStartFunctions<EKType1> >(); |
| 388 | 389 | checkMaxFlowAlg<EKType2, GeneralStartFunctions<EKType2> >(); |
| 389 | 390 | |
| 390 | | initFlowTest(); |
| 391 | | |
| 392 | 391 | return 0; |
| 393 | 392 | } |
# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1521741359 -3600
# Thu Mar 22 18:55:59 2018 +0100
# Node ID e018899c2926e73e5f825f893cd3cea8edc1d54b
# Parent e2732b9da429ccdd732e43e62c580640a36af15e
Use tolerance in max_flow_test.cc (#608)
diff --git a/test/max_flow_test.cc b/test/max_flow_test.cc
|
a
|
b
|
|
| 26 | 26 | #include <lemon/concepts/maps.h> |
| 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; |
| 31 | 32 | |
| … |
… |
|
| 65 | 66 | "source 1\n" |
| 66 | 67 | "target 8\n"; |
| 67 | 68 | |
| 68 | | |
| 69 | 69 | // Checks the general interface of a max flow algorithm |
| 70 | 70 | template <typename GR, typename CAP> |
| 71 | 71 | struct MaxFlowClassConcept |
| … |
… |
|
| 197 | 197 | bool checkFlow(const SmartDigraph& g, |
| 198 | 198 | const SmartDigraph::ArcMap<T>& flow, |
| 199 | 199 | const SmartDigraph::ArcMap<T>& cap, |
| 200 | | SmartDigraph::Node s, SmartDigraph::Node t) { |
| | 200 | SmartDigraph::Node s, SmartDigraph::Node t, |
| | 201 | const Tolerance<T>& tol) { |
| 201 | 202 | |
| 202 | 203 | for (SmartDigraph::ArcIt e(g); e != INVALID; ++e) { |
| 203 | | if (flow[e] < 0 || flow[e] > cap[e]) return false; |
| | 204 | if (tol.negative(flow[e]) || tol.less(cap[e], flow[e])) return false; |
| 204 | 205 | } |
| 205 | 206 | |
| 206 | 207 | for (SmartDigraph::NodeIt n(g); n != INVALID; ++n) { |
| … |
… |
|
| 212 | 213 | for (SmartDigraph::InArcIt e(g, n); e != INVALID; ++e) { |
| 213 | 214 | sum -= flow[e]; |
| 214 | 215 | } |
| 215 | | if (sum != 0) return false; |
| | 216 | if (tol.nonZero(sum)) return false; |
| 216 | 217 | } |
| 217 | 218 | return true; |
| 218 | 219 | } |
| … |
… |
|
| 251 | 252 | typedef CapMap FlowMap; |
| 252 | 253 | typedef BoolNodeMap CutMap; |
| 253 | 254 | |
| | 255 | Tolerance<Value> tol; |
| | 256 | |
| 254 | 257 | Digraph g; |
| 255 | 258 | Node s, t; |
| 256 | 259 | CapMap cap(g); |
| … |
… |
|
| 264 | 267 | MF max_flow(g, cap, s, t); |
| 265 | 268 | max_flow.run(); |
| 266 | 269 | |
| 267 | | check(checkFlow(g, max_flow.flowMap(), cap, s, t), |
| | 270 | check(checkFlow(g, max_flow.flowMap(), cap, s, t, tol), |
| 268 | 271 | "The flow is not feasible."); |
| 269 | 272 | |
| 270 | 273 | CutMap min_cut(g); |
| 271 | 274 | max_flow.minCutMap(min_cut); |
| 272 | 275 | Value min_cut_value = cutValue(g, min_cut, cap); |
| 273 | 276 | |
| 274 | | check(max_flow.flowValue() == min_cut_value, |
| | 277 | check(!tol.different(max_flow.flowValue(), min_cut_value), |
| 275 | 278 | "The max flow value is not equal to the min cut value."); |
| 276 | 279 | |
| 277 | 280 | FlowMap flow(g); |
| … |
… |
|
| 288 | 291 | max_flow.minCutMap(min_cut1); |
| 289 | 292 | min_cut_value = cutValue(g, min_cut1, cap); |
| 290 | 293 | |
| 291 | | check(max_flow.flowValue() == min_cut_value && |
| 292 | | min_cut_value == 2 * flow_value, |
| | 294 | check(!tol.different(max_flow.flowValue(), min_cut_value) && |
| | 295 | !tol.different(min_cut_value, 2 * flow_value), |
| 293 | 296 | "The max flow value or the min cut value is wrong."); |
| 294 | 297 | |
| 295 | 298 | SF::startSecondPhase(max_flow); // start second phase of the algorithm |
| 296 | 299 | |
| 297 | | check(checkFlow(g, max_flow.flowMap(), cap, s, t), |
| | 300 | check(checkFlow(g, max_flow.flowMap(), cap, s, t, tol), |
| 298 | 301 | "The flow is not feasible."); |
| 299 | 302 | |
| 300 | 303 | CutMap min_cut2(g); |
| 301 | 304 | max_flow.minCutMap(min_cut2); |
| 302 | 305 | min_cut_value = cutValue(g, min_cut2, cap); |
| 303 | 306 | |
| 304 | | check(max_flow.flowValue() == min_cut_value && |
| 305 | | min_cut_value == 2 * flow_value, |
| | 307 | check(!tol.different(max_flow.flowValue(), min_cut_value) && |
| | 308 | !tol.different(min_cut_value, 2 * flow_value), |
| 306 | 309 | "The max flow value or the min cut value was not doubled."); |
| 307 | 310 | |
| 308 | 311 | max_flow.flowMap(flow); |
| … |
… |
|
| 324 | 327 | max_flow.minCutMap(min_cut3); |
| 325 | 328 | min_cut_value = cutValue(g, min_cut3, cap); |
| 326 | 329 | |
| 327 | | check(max_flow.flowValue() == min_cut_value, |
| | 330 | check(!tol.different(max_flow.flowValue(), min_cut_value), |
| 328 | 331 | "The max flow value or the min cut value is wrong."); |
| 329 | 332 | } |
| 330 | 333 | |
# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1521741386 -3600
# Thu Mar 22 18:56:26 2018 +0100
# Node ID 259e3a90ad9762ec1d5adfe8f259aeb59acc79f1
# Parent e018899c2926e73e5f825f893cd3cea8edc1d54b
Improve max flow test method: set expected flow value (#608)
diff --git a/test/max_flow_test.cc b/test/max_flow_test.cc
|
a
|
b
|
|
| 243 | 243 | } |
| 244 | 244 | |
| 245 | 245 | template <typename MF, typename SF> |
| 246 | | void checkMaxFlowAlg() { |
| | 246 | void checkMaxFlowAlg(const char *input_lgf, typename MF::Value expected) { |
| 247 | 247 | typedef SmartDigraph Digraph; |
| 248 | 248 | DIGRAPH_TYPEDEFS(Digraph); |
| 249 | 249 | |
| … |
… |
|
| 257 | 257 | Digraph g; |
| 258 | 258 | Node s, t; |
| 259 | 259 | CapMap cap(g); |
| 260 | | std::istringstream input(test_lgf); |
| | 260 | std::istringstream input(input_lgf); |
| 261 | 261 | DigraphReader<Digraph>(g,input) |
| 262 | 262 | .arcMap("capacity", cap) |
| 263 | 263 | .node("source",s) |
| … |
… |
|
| 267 | 267 | MF max_flow(g, cap, s, t); |
| 268 | 268 | max_flow.run(); |
| 269 | 269 | |
| | 270 | check(!tol.different(expected, max_flow.flowValue()), |
| | 271 | "Incorrect max flow value."); |
| 270 | 272 | check(checkFlow(g, max_flow.flowMap(), cap, s, t, tol), |
| 271 | 273 | "The flow is not feasible."); |
| 272 | 274 | |
| … |
… |
|
| 274 | 276 | max_flow.minCutMap(min_cut); |
| 275 | 277 | Value min_cut_value = cutValue(g, min_cut, cap); |
| 276 | 278 | |
| 277 | | check(!tol.different(max_flow.flowValue(), min_cut_value), |
| 278 | | "The max flow value is not equal to the min cut value."); |
| | 279 | check(!tol.different(expected, min_cut_value), |
| | 280 | "Incorrect min cut value."); |
| 279 | 281 | |
| 280 | 282 | FlowMap flow(g); |
| 281 | 283 | for (ArcIt e(g); e != INVALID; ++e) flow[e] = max_flow.flowMap()[e]; |
| 282 | | |
| 283 | | Value flow_value = max_flow.flowValue(); |
| 284 | | |
| 285 | 284 | for (ArcIt e(g); e != INVALID; ++e) cap[e] = 2 * cap[e]; |
| 286 | 285 | max_flow.init(flow); |
| 287 | 286 | |
| … |
… |
|
| 291 | 290 | max_flow.minCutMap(min_cut1); |
| 292 | 291 | min_cut_value = cutValue(g, min_cut1, cap); |
| 293 | 292 | |
| 294 | | check(!tol.different(max_flow.flowValue(), min_cut_value) && |
| 295 | | !tol.different(min_cut_value, 2 * flow_value), |
| 296 | | "The max flow value or the min cut value is wrong."); |
| | 293 | check(!tol.different(2 * expected, max_flow.flowValue()), |
| | 294 | "Incorrect max flow value."); |
| | 295 | check(!tol.different(2 * expected, min_cut_value), |
| | 296 | "Incorrect min cut value."); |
| 297 | 297 | |
| 298 | 298 | SF::startSecondPhase(max_flow); // start second phase of the algorithm |
| 299 | 299 | |
| … |
… |
|
| 304 | 304 | max_flow.minCutMap(min_cut2); |
| 305 | 305 | min_cut_value = cutValue(g, min_cut2, cap); |
| 306 | 306 | |
| 307 | | check(!tol.different(max_flow.flowValue(), min_cut_value) && |
| 308 | | !tol.different(min_cut_value, 2 * flow_value), |
| 309 | | "The max flow value or the min cut value was not doubled."); |
| | 307 | check(!tol.different(2 * expected, max_flow.flowValue()), |
| | 308 | "Incorrect max flow value."); |
| | 309 | check(!tol.different(2 * expected, min_cut_value), |
| | 310 | "Incorrect min cut value."); |
| 310 | 311 | |
| 311 | 312 | max_flow.flowMap(flow); |
| 312 | 313 | |
| … |
… |
|
| 380 | 381 | // Check Preflow |
| 381 | 382 | typedef Preflow<SmartDigraph, SmartDigraph::ArcMap<int> > PType1; |
| 382 | 383 | typedef Preflow<SmartDigraph, SmartDigraph::ArcMap<float> > PType2; |
| 383 | | checkMaxFlowAlg<PType1, PreflowStartFunctions<PType1> >(); |
| 384 | | checkMaxFlowAlg<PType2, PreflowStartFunctions<PType2> >(); |
| | 384 | typedef Preflow<SmartDigraph, SmartDigraph::ArcMap<double> > PType3; |
| | 385 | checkMaxFlowAlg<PType1, PreflowStartFunctions<PType1> >(test_lgf, 13); |
| | 386 | checkMaxFlowAlg<PType2, PreflowStartFunctions<PType2> >(test_lgf, 13); |
| | 387 | checkMaxFlowAlg<PType3, PreflowStartFunctions<PType3> >(test_lgf, 13); |
| 385 | 388 | |
| 386 | 389 | checkInitPreflow(); |
| 387 | 390 | |
| 388 | 391 | // Check EdmondsKarp |
| 389 | 392 | typedef EdmondsKarp<SmartDigraph, SmartDigraph::ArcMap<int> > EKType1; |
| 390 | 393 | typedef EdmondsKarp<SmartDigraph, SmartDigraph::ArcMap<float> > EKType2; |
| 391 | | checkMaxFlowAlg<EKType1, GeneralStartFunctions<EKType1> >(); |
| 392 | | checkMaxFlowAlg<EKType2, GeneralStartFunctions<EKType2> >(); |
| | 394 | typedef EdmondsKarp<SmartDigraph, SmartDigraph::ArcMap<double> > EKType3; |
| | 395 | checkMaxFlowAlg<EKType1, GeneralStartFunctions<EKType1> >(test_lgf, 13); |
| | 396 | checkMaxFlowAlg<EKType2, GeneralStartFunctions<EKType2> >(test_lgf, 13); |
| | 397 | checkMaxFlowAlg<EKType3, GeneralStartFunctions<EKType3> >(test_lgf, 13); |
| 393 | 398 | |
| 394 | 399 | return 0; |
| 395 | 400 | } |
# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1521741407 -3600
# Thu Mar 22 18:56:47 2018 +0100
# Node ID 8db773f19586549b6df21c715965f16113267092
# Parent 259e3a90ad9762ec1d5adfe8f259aeb59acc79f1
Fix tolerance usage in Preflow algorithm (#608)
diff --git a/lemon/preflow.h b/lemon/preflow.h
|
a
|
b
|
|
| 476 | 476 | /// Initializes the internal data structures and sets the initial |
| 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 the |
| | 479 | /// 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. |
| 482 | 482 | template <typename FlowMap> |
| … |
… |
|
| 495 | 495 | for (OutArcIt e(_graph, n); e != INVALID; ++e) { |
| 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 | } |
| 501 | 501 | |
| … |
… |
|
| 639 | 639 | |
| 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); |
| 645 | 645 | } else { |
| … |
… |
|
| 720 | 720 | |
| 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); |
| 726 | 726 | } else { |
| … |
… |
|
| 791 | 791 | for (NodeIt n(_graph); n != INVALID; ++n) { |
| 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 | } |
| 797 | 797 | } |
| … |
… |
|
| 852 | 852 | |
| 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); |
| 858 | 858 | } else { |
diff --git a/test/max_flow_test.cc b/test/max_flow_test.cc
|
a
|
b
|
|
| 66 | 66 | "source 1\n" |
| 67 | 67 | "target 8\n"; |
| 68 | 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"; |
| | 100 | |
| 69 | 101 | // Checks the general interface of a max flow algorithm |
| 70 | 102 | template <typename GR, typename CAP> |
| 71 | 103 | struct MaxFlowClassConcept |
| … |
… |
|
| 258 | 290 | Node s, t; |
| 259 | 291 | CapMap cap(g); |
| 260 | 292 | std::istringstream input(input_lgf); |
| 261 | | DigraphReader<Digraph>(g,input) |
| | 293 | DigraphReader<Digraph>(g, input) |
| 262 | 294 | .arcMap("capacity", cap) |
| 263 | | .node("source",s) |
| 264 | | .node("target",t) |
| | 295 | .node("source", s) |
| | 296 | .node("target", t) |
| 265 | 297 | .run(); |
| 266 | 298 | |
| 267 | 299 | MF max_flow(g, cap, s, t); |
| … |
… |
|
| 280 | 312 | "Incorrect min cut value."); |
| 281 | 313 | |
| 282 | 314 | FlowMap flow(g); |
| 283 | | for (ArcIt e(g); e != INVALID; ++e) flow[e] = max_flow.flowMap()[e]; |
| 284 | | 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]; |
| 285 | 317 | max_flow.init(flow); |
| 286 | 318 | |
| 287 | 319 | SF::startFirstPhase(max_flow); // start first phase of the algorithm |
| … |
… |
|
| 290 | 322 | max_flow.minCutMap(min_cut1); |
| 291 | 323 | min_cut_value = cutValue(g, min_cut1, cap); |
| 292 | 324 | |
| 293 | | check(!tol.different(2 * expected, max_flow.flowValue()), |
| | 325 | check(!tol.different(17 * expected, max_flow.flowValue()), |
| 294 | 326 | "Incorrect max flow value."); |
| 295 | | check(!tol.different(2 * expected, min_cut_value), |
| | 327 | check(!tol.different(17 * expected, min_cut_value), |
| 296 | 328 | "Incorrect min cut value."); |
| 297 | 329 | |
| 298 | 330 | SF::startSecondPhase(max_flow); // start second phase of the algorithm |
| … |
… |
|
| 304 | 336 | max_flow.minCutMap(min_cut2); |
| 305 | 337 | min_cut_value = cutValue(g, min_cut2, cap); |
| 306 | 338 | |
| 307 | | check(!tol.different(2 * expected, max_flow.flowValue()), |
| | 339 | check(!tol.different(17 * expected, max_flow.flowValue()), |
| 308 | 340 | "Incorrect max flow value."); |
| 309 | | check(!tol.different(2 * expected, min_cut_value), |
| | 341 | check(!tol.different(17 * expected, min_cut_value), |
| 310 | 342 | "Incorrect min cut value."); |
| 311 | 343 | |
| 312 | 344 | max_flow.flowMap(flow); |
| … |
… |
|
| 382 | 414 | typedef Preflow<SmartDigraph, SmartDigraph::ArcMap<int> > PType1; |
| 383 | 415 | typedef Preflow<SmartDigraph, SmartDigraph::ArcMap<float> > PType2; |
| 384 | 416 | typedef Preflow<SmartDigraph, SmartDigraph::ArcMap<double> > PType3; |
| | 417 | |
| 385 | 418 | checkMaxFlowAlg<PType1, PreflowStartFunctions<PType1> >(test_lgf, 13); |
| 386 | 419 | checkMaxFlowAlg<PType2, PreflowStartFunctions<PType2> >(test_lgf, 13); |
| 387 | 420 | checkMaxFlowAlg<PType3, PreflowStartFunctions<PType3> >(test_lgf, 13); |
| 388 | 421 | |
| | 422 | checkMaxFlowAlg<PType2, PreflowStartFunctions<PType2> >(test_lgf_float, 0.3); |
| | 423 | checkMaxFlowAlg<PType3, PreflowStartFunctions<PType3> >(test_lgf_float, 0.3); |
| | 424 | |
| 389 | 425 | checkInitPreflow(); |
| 390 | 426 | |
| 391 | 427 | // Check EdmondsKarp |
| 392 | 428 | typedef EdmondsKarp<SmartDigraph, SmartDigraph::ArcMap<int> > EKType1; |
| 393 | 429 | typedef EdmondsKarp<SmartDigraph, SmartDigraph::ArcMap<float> > EKType2; |
| 394 | 430 | typedef EdmondsKarp<SmartDigraph, SmartDigraph::ArcMap<double> > EKType3; |
| | 431 | |
| 395 | 432 | checkMaxFlowAlg<EKType1, GeneralStartFunctions<EKType1> >(test_lgf, 13); |
| 396 | 433 | checkMaxFlowAlg<EKType2, GeneralStartFunctions<EKType2> >(test_lgf, 13); |
| 397 | 434 | checkMaxFlowAlg<EKType3, GeneralStartFunctions<EKType3> >(test_lgf, 13); |
| 398 | 435 | |
| | 436 | checkMaxFlowAlg<EKType2, GeneralStartFunctions<EKType2> >(test_lgf_float, 0.3); |
| | 437 | checkMaxFlowAlg<EKType3, GeneralStartFunctions<EKType3> >(test_lgf_float, 0.3); |
| | 438 | |
| 399 | 439 | return 0; |
| 400 | 440 | } |