[Lemon-commits] Peter Kovacs: Merge test files of Preflow and Ed...

Lemon HG hg at lemon.cs.elte.hu
Tue Mar 19 15:42:34 CET 2013


details:   http://lemon.cs.elte.hu/hg/lemon/rev/45befc97b1bc
changeset: 1228:45befc97b1bc
user:      Peter Kovacs <kpeter [at] inf.elte.hu>
date:      Thu Feb 28 23:44:35 2013 +0100
description:
	Merge test files of Preflow and EdmondsKarp (#177)

diffstat:

 lemon/edmonds_karp.h      |    2 +
 test/CMakeLists.txt       |    3 +-
 test/edmonds_karp_test.cc |  236 -----------------------------------
 test/preflow_test.cc      |  308 +++++++++++++++++++++++++++++++--------------
 4 files changed, 216 insertions(+), 333 deletions(-)

diffs (truncated from 689 to 300 lines):

diff --git a/lemon/edmonds_karp.h b/lemon/edmonds_karp.h
--- a/lemon/edmonds_karp.h
+++ b/lemon/edmonds_karp.h
@@ -167,6 +167,8 @@
     
   public:
 
+    typedef EdmondsKarp Create;
+
     ///\name Named template parameters
 
     ///@{
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -25,7 +25,6 @@
   dijkstra_test
   dim_test
   edge_set_test
-  edmonds_karp_test
   error_test
   euler_test
   fractional_matching_test
@@ -42,13 +41,13 @@
   matching_test
   max_cardinality_search_test
   max_clique_test
+  max_flow_test
   min_cost_arborescence_test
   min_cost_flow_test
   min_mean_cycle_test
   nagamochi_ibaraki_test
   path_test
   planarity_test
-  preflow_test
   radix_sort_test
   random_test
   suurballe_test
diff --git a/test/edmonds_karp_test.cc b/test/edmonds_karp_test.cc
deleted file mode 100644
--- a/test/edmonds_karp_test.cc
+++ /dev/null
@@ -1,236 +0,0 @@
-/* -*- mode: C++; indent-tabs-mode: nil; -*-
- *
- * This file is a part of LEMON, a generic C++ optimization library.
- *
- * Copyright (C) 2003-2010
- * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
- * (Egervary Research Group on Combinatorial Optimization, EGRES).
- *
- * Permission to use, modify and distribute this software is granted
- * provided that this copyright notice appears in all copies. For
- * precise terms see the accompanying LICENSE file.
- *
- * This software is provided "AS IS" with no warranty of any kind,
- * express or implied, and with no claim as to its suitability for any
- * purpose.
- *
- */
-
-#include<iostream>
-
-#include "test_tools.h"
-#include<lemon/smart_graph.h>
-#include<lemon/edmonds_karp.h>
-#include <lemon/concepts/digraph.h>
-#include <lemon/concepts/maps.h>
-#include <lemon/lgf_reader.h>
-
-using namespace lemon;
-
-char test_lgf[] =
-  "@nodes\n"
-  "label\n"
-  "0\n"
-  "1\n"
-  "2\n"
-  "3\n"
-  "4\n"
-  "5\n"
-  "6\n"
-  "7\n"
-  "8\n"
-  "9\n"
-  "@arcs\n"
-  "    label capacity\n"
-  "0 1 0     20\n"
-  "0 2 1     0\n"
-  "1 1 2     3\n"
-  "1 2 3     8\n"
-  "1 3 4     8\n"
-  "2 5 5     5\n"
-  "3 2 6     5\n"
-  "3 5 7     5\n"
-  "3 6 8     5\n"
-  "4 3 9     3\n"
-  "5 7 10    3\n"
-  "5 6 11    10\n"
-  "5 8 12    10\n"
-  "6 8 13    8\n"
-  "8 9 14    20\n"
-  "8 1 15    5\n"
-  "9 5 16    5\n"
-  "@attributes\n"
-  "source 1\n"
-  "target 8\n";
-
-void checkEdmondKarpCompile() {
-  typedef int VType;
-  typedef concepts::Digraph Digraph;
-
-  typedef Digraph::Node Node;
-  typedef Digraph::Arc Arc;
-  typedef concepts::ReadMap<Arc,VType> CapMap;
-  typedef concepts::ReadWriteMap<Arc,VType> FlowMap;
-  typedef concepts::WriteMap<Node,bool> CutMap;
-
-  Digraph g;
-  Node n;
-  Arc e;
-  CapMap cap;
-  FlowMap flow;
-  CutMap cut;
-  VType v;
-  bool b;
-  ignore_unused_variable_warning(v,b);
-  typedef EdmondsKarp<Digraph, CapMap>
-              ::SetFlowMap<FlowMap>
-              ::Create EKType;
-  EKType ek_test(g, cap, n, n);
-  const EKType& const_ek_test = ek_test;
-
-  EKType::Tolerance tol = const_ek_test.tolerance();
-  ek_test.tolerance(tol);
-
-  ek_test
-    .capacityMap(cap)
-    .flowMap(flow)
-    .source(n)
-    .target(n);
-
-  ek_test.init();
-  ek_test.start();
-
-  v = const_ek_test.flowValue();
-  v = const_ek_test.flow(e);
-
-  const FlowMap& fm = const_ek_test.flowMap();
-  b = const_ek_test.minCut(n);
-  const_ek_test.minCutMap(cut);
-
-  ignore_unused_variable_warning(fm);
-}
-
-int cutValue (const SmartDigraph& g,
-              const SmartDigraph::NodeMap<bool>& cut,
-              const SmartDigraph::ArcMap<int>& cap) {
-
-  int c=0;
-  for(SmartDigraph::ArcIt e(g); e!=INVALID; ++e) {
-    if (cut[g.source(e)] && !cut[g.target(e)]) c+=cap[e];
-  }
-  return c;
-}
-
-bool checkFlow(const SmartDigraph& g,
-               const SmartDigraph::ArcMap<int>& flow,
-               const SmartDigraph::ArcMap<int>& cap,
-               SmartDigraph::Node s, SmartDigraph::Node t) {
-
-  for (SmartDigraph::ArcIt e(g); e != INVALID; ++e) {
-    if (flow[e] < 0 || flow[e] > cap[e]) return false;
-  }
-
-  for (SmartDigraph::NodeIt n(g); n != INVALID; ++n) {
-    if (n == s || n == t) continue;
-    int sum = 0;
-    for (SmartDigraph::OutArcIt e(g, n); e != INVALID; ++e) {
-      sum += flow[e];
-    }
-    for (SmartDigraph::InArcIt e(g, n); e != INVALID; ++e) {
-      sum -= flow[e];
-    }
-    if (sum != 0) return false;
-  }
-  return true;
-}
-
-int main() {
-
-  typedef SmartDigraph Digraph;
-
-  typedef Digraph::Node Node;
-  typedef Digraph::NodeIt NodeIt;
-  typedef Digraph::ArcIt ArcIt;
-  typedef Digraph::ArcMap<int> CapMap;
-  typedef Digraph::ArcMap<int> FlowMap;
-  typedef Digraph::NodeMap<bool> CutMap;
-
-  typedef EdmondsKarp<Digraph, CapMap> EKType;
-
-  Digraph g;
-  Node s, t;
-  CapMap cap(g);
-  std::istringstream input(test_lgf);
-  DigraphReader<Digraph>(g,input).
-    arcMap("capacity", cap).
-    node("source",s).
-    node("target",t).
-    run();
-
-  EKType ek_test(g, cap, s, t);
-  ek_test.run();
-
-  check(checkFlow(g, ek_test.flowMap(), cap, s, t),
-        "The flow is not feasible.");
-
-  CutMap min_cut(g);
-  ek_test.minCutMap(min_cut);
-  int min_cut_value=cutValue(g,min_cut,cap);
-
-  check(ek_test.flowValue() == min_cut_value,
-        "The max flow value is not equal to the three min cut values.");
-
-  FlowMap flow(g);
-  for(ArcIt e(g); e!=INVALID; ++e) flow[e] = ek_test.flowMap()[e];
-
-  int flow_value=ek_test.flowValue();
-
-  for(ArcIt e(g); e!=INVALID; ++e) cap[e]=2*cap[e];
-  ek_test.init(flow);
-  ek_test.start();
-
-  CutMap min_cut1(g);
-  ek_test.minCutMap(min_cut1);
-  min_cut_value=cutValue(g,min_cut1,cap);
-
-  check(ek_test.flowValue() == min_cut_value &&
-        min_cut_value == 2*flow_value,
-        "The max flow value or the min cut value is wrong.");
-
-  check(checkFlow(g, ek_test.flowMap(), cap, s, t),
-        "The flow is not feasible.");
-
-  CutMap min_cut2(g);
-  ek_test.minCutMap(min_cut2);
-  min_cut_value=cutValue(g,min_cut2,cap);
-
-  check(ek_test.flowValue() == min_cut_value &&
-        min_cut_value == 2*flow_value,
-        "The max flow value or the three min cut values were not doubled.");
-
-
-  ek_test.flowMap(flow);
-
-  NodeIt tmp1(g,s);
-  ++tmp1;
-  if ( tmp1 != INVALID ) s=tmp1;
-
-  NodeIt tmp2(g,t);
-  ++tmp2;
-  if ( tmp2 != INVALID ) t=tmp2;
-
-  ek_test.source(s);
-  ek_test.target(t);
-
-  ek_test.run();
-
-  CutMap min_cut3(g);
-  ek_test.minCutMap(min_cut3);
-  min_cut_value=cutValue(g,min_cut3,cap);
-
-
-  check(ek_test.flowValue() == min_cut_value,
-        "The max flow value or the three min cut values are incorrect.");
-
-  return 0;
-}
diff --git a/test/preflow_test.cc b/test/max_flow_test.cc
rename from test/preflow_test.cc
rename to test/max_flow_test.cc
--- a/test/preflow_test.cc
+++ b/test/max_flow_test.cc
@@ -21,6 +21,7 @@
 #include "test_tools.h"
 #include <lemon/smart_graph.h>
 #include <lemon/preflow.h>
+#include <lemon/edmonds_karp.h>
 #include <lemon/concepts/digraph.h>
 #include <lemon/concepts/maps.h>
 #include <lemon/lgf_reader.h>
@@ -64,79 +65,140 @@
   "source 1\n"
   "target 8\n";
 
+
+// Checks the general interface of a max flow algorithm
+template <typename GR, typename CAP>
+struct MaxFlowClassConcept



More information about the Lemon-commits mailing list