[Lemon-commits] Peter Kovacs: Improve test file for Circulation ...

Lemon HG hg at lemon.cs.elte.hu
Mon Dec 1 15:32:25 CET 2008


details:   http://lemon.cs.elte.hu/hg/lemon/rev/940587667b47
changeset: 418:940587667b47
user:      Peter Kovacs <kpeter [at] inf.elte.hu>
date:      Mon Dec 01 14:23:59 2008 +0100
description:
	Improve test file for Circulation (#175)

	 - Bug fix: add a missing #include.
	 - Add compile test for various functions and named parameters.
	 - Use a smaller digraph with lower bounds.
	 - Test eight instances instead of two.
	 - Remove the doc that was for the demo file.

diffstat:

1 file changed, 118 insertions(+), 80 deletions(-)
test/circulation_test.cc |  198 +++++++++++++++++++++++++++-------------------

diffs (225 lines):

diff -r 235be9d4b6ab -r 940587667b47 test/circulation_test.cc
--- a/test/circulation_test.cc	Sun Nov 30 14:51:05 2008 +0100
+++ b/test/circulation_test.cc	Mon Dec 01 14:23:59 2008 +0100
@@ -16,103 +16,141 @@
  *
  */
 
-///\ingroup demos
-///\file
-///\brief Demonstrating the usage of LEMON's General Flow algorithm
-///
-/// This demo program reads a general network circulation problem from the
-/// file 'circulation-input.lgf', runs the preflow based algorithm for
-/// finding a feasible solution and writes the output
-/// to 'circulation-input.lgf'
-///
-/// \include circulation_demo.cc
-
 #include <iostream>
 
 #include "test_tools.h"
 #include <lemon/list_graph.h>
 #include <lemon/circulation.h>
 #include <lemon/lgf_reader.h>
+#include <lemon/concepts/digraph.h>
+#include <lemon/concepts/maps.h>
 
 using namespace lemon;
 
 char test_lgf[] =
   "@nodes\n"
-  "label delta\n"
-  "0     0\n"
-  "1     13\n"
-  "2     0\n"
-  "3     0\n"
-  "4     0\n"
-  "5     0\n"
-  "6     0\n"
-  "7     0\n"
-  "8     -13\n"
-  "9     0\n"
-  "@edges\n"
-  "    label lo_cap up_cap\n"
-  "0 1 0     0      20\n"
-  "0 2 1     0      0\n"
-  "1 1 2     0      3\n"
-  "1 2 3     0      8\n"
-  "1 3 4     0      8\n"
-  "2 5 5     0      5\n"
-  "3 2 6     0      5\n"
-  "3 5 7     0      5\n"
-  "3 6 8     0      5\n"
-  "4 3 9     0      3\n"
-  "5 7 10    0      3\n"
-  "5 6 11    0      10\n"
-  "5 8 12    0      10\n"
-  "6 8 13    0      8\n"
-  "8 9 14    0      20\n"
-  "8 1 15    0      5\n"
-  "9 5 16    0      5\n"
+  "label\n"
+  "0\n"
+  "1\n"
+  "2\n"
+  "3\n"
+  "4\n"
+  "5\n"
+  "@arcs\n"
+  "     lcap  ucap\n"
+  "0 1  2  10\n"
+  "0 2  2  6\n"
+  "1 3  4  7\n"
+  "1 4  0  5\n"
+  "2 4  1  3\n"
+  "3 5  3  8\n"
+  "4 5  3  7\n"
   "@attributes\n"
-  "source 1\n"
-  "sink   8\n";
+  "source 0\n"
+  "sink   5\n";
+
+void checkCirculationCompile()
+{
+  typedef int VType;
+  typedef concepts::Digraph Digraph;
+
+  typedef Digraph::Node Node;
+  typedef Digraph::Arc Arc;
+  typedef concepts::ReadMap<Arc,VType> CapMap;
+  typedef concepts::ReadMap<Node,VType> DeltaMap;
+  typedef concepts::ReadWriteMap<Arc,VType> FlowMap;
+  typedef concepts::WriteMap<Node,bool> BarrierMap;
+
+  typedef Elevator<Digraph, Digraph::Node> Elev;
+  typedef LinkedElevator<Digraph, Digraph::Node> LinkedElev;
+
+  Digraph g;
+  Node n;
+  Arc a;
+  CapMap lcap, ucap;
+  DeltaMap delta;
+  FlowMap flow;
+  BarrierMap bar;
+
+  Circulation<Digraph, CapMap, CapMap, DeltaMap>
+    ::SetFlowMap<FlowMap>
+    ::SetElevator<Elev>
+    ::SetStandardElevator<LinkedElev>
+    ::Create circ_test(g,lcap,ucap,delta);
+
+  circ_test.lowerCapMap(lcap);
+  circ_test.upperCapMap(ucap);
+  circ_test.deltaMap(delta);
+  flow = circ_test.flowMap();
+  circ_test.flowMap(flow);
+
+  circ_test.init();
+  circ_test.greedyInit();
+  circ_test.start();
+  circ_test.run();
+
+  circ_test.barrier(n);
+  circ_test.barrierMap(bar);
+  circ_test.flow(a);
+}
+
+template <class G, class LM, class UM, class DM>
+void checkCirculation(const G& g, const LM& lm, const UM& um,
+                      const DM& dm, bool find)
+{
+  Circulation<G, LM, UM, DM> circ(g, lm, um, dm);
+  bool ret = circ.run();
+  if (find) {
+    check(ret, "A feasible solution should have been found.");
+    check(circ.checkFlow(), "The found flow is corrupt.");
+    check(!circ.checkBarrier(), "A barrier should not have been found.");
+  } else {
+    check(!ret, "A feasible solution should not have been found.");
+    check(circ.checkBarrier(), "The found barrier is corrupt.");
+  }
+}
 
 int main (int, char*[])
 {
+  typedef ListDigraph Digraph;
+  DIGRAPH_TYPEDEFS(Digraph);
 
-    typedef ListDigraph Digraph;
-    typedef Digraph::Node Node;
-    typedef Digraph::NodeIt NodeIt;
-    typedef Digraph::Arc Arc;
-    typedef Digraph::ArcIt ArcIt;
-    typedef Digraph::ArcMap<int> ArcMap;
-    typedef Digraph::NodeMap<int> NodeMap;
-    typedef Digraph::NodeMap<double> DNodeMap;
+  Digraph g;
+  IntArcMap lo(g), up(g);
+  IntNodeMap delta(g, 0);
+  Node s, t;
 
-    Digraph g;
-    ArcMap lo(g);
-    ArcMap up(g);
-    NodeMap delta(g);
-    NodeMap nid(g);
-    ArcMap eid(g);
-    Node source, sink;
-    
-    std::istringstream input(test_lgf);
-    DigraphReader<Digraph>(g,input).
-      arcMap("lo_cap", lo).
-      arcMap("up_cap", up).
-      nodeMap("delta", delta).
-      arcMap("label", eid).
-      nodeMap("label", nid).
-      node("source",source).
-      node("sink",sink).
-      run();
+  std::istringstream input(test_lgf);
+  DigraphReader<Digraph>(g,input).
+    arcMap("lcap", lo).
+    arcMap("ucap", up).
+    node("source",s).
+    node("sink",t).
+    run();
 
-    Circulation<Digraph> gen(g,lo,up,delta);
-    bool ret=gen.run();
-    check(ret,"A feasible solution should have been found.");
-    check(gen.checkFlow(), "The found flow is corrupt.");
-    
-    delta[source]=14;
-    delta[sink]=-14;
-    
-    bool ret2=gen.run();
-    check(!ret2,"A feasible solution should not have been found.");
-    check(gen.checkBarrier(), "The found barrier is corrupt.");
+  delta[s] = 7; delta[t] = -7;
+  checkCirculation(g, lo, up, delta, true);
 
+  delta[s] = 13; delta[t] = -13;
+  checkCirculation(g, lo, up, delta, true);
+
+  delta[s] = 6; delta[t] = -6;
+  checkCirculation(g, lo, up, delta, false);
+
+  delta[s] = 14; delta[t] = -14;
+  checkCirculation(g, lo, up, delta, false);
+
+  delta[s] = 7; delta[t] = -13;
+  checkCirculation(g, lo, up, delta, true);
+
+  delta[s] = 5; delta[t] = -15;
+  checkCirculation(g, lo, up, delta, true);
+
+  delta[s] = 10; delta[t] = -11;
+  checkCirculation(g, lo, up, delta, true);
+
+  delta[s] = 11; delta[t] = -10;
+  checkCirculation(g, lo, up, delta, false);
+
+  return 0;
 }



More information about the Lemon-commits mailing list