Ticket #175: circ-test_63c4cc72d7eb.patch
File circ-test_63c4cc72d7eb.patch, 6.0 KB (added by , 16 years ago) |
---|
-
test/circulation_test.cc
# HG changeset patch # User Peter Kovacs <kpeter@inf.elte.hu> # Date 1228137839 -3600 # Node ID 63c4cc72d7eb6d439c34500d0b67c41c56cad0e0 # Parent b4fbf36feb573d42ed32a2ef8d24dc99c53c0fdc 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. diff --git a/test/circulation_test.cc b/test/circulation_test.cc
a b 16 16 * 17 17 */ 18 18 19 ///\ingroup demos20 ///\file21 ///\brief Demonstrating the usage of LEMON's General Flow algorithm22 ///23 /// This demo program reads a general network circulation problem from the24 /// file 'circulation-input.lgf', runs the preflow based algorithm for25 /// finding a feasible solution and writes the output26 /// to 'circulation-input.lgf'27 ///28 /// \include circulation_demo.cc29 30 19 #include <iostream> 31 20 21 #include "test_tools.h" 32 22 #include <lemon/list_graph.h> 33 23 #include <lemon/circulation.h> 34 24 #include <lemon/lgf_reader.h> 25 #include <lemon/concepts/digraph.h> 26 #include <lemon/concepts/maps.h> 35 27 36 28 using namespace lemon; 37 29 38 30 char test_lgf[] = 39 31 "@nodes\n" 40 "label delta\n" 41 "0 0\n" 42 "1 13\n" 43 "2 0\n" 44 "3 0\n" 45 "4 0\n" 46 "5 0\n" 47 "6 0\n" 48 "7 0\n" 49 "8 -13\n" 50 "9 0\n" 51 "@edges\n" 52 " label lo_cap up_cap\n" 53 "0 1 0 0 20\n" 54 "0 2 1 0 0\n" 55 "1 1 2 0 3\n" 56 "1 2 3 0 8\n" 57 "1 3 4 0 8\n" 58 "2 5 5 0 5\n" 59 "3 2 6 0 5\n" 60 "3 5 7 0 5\n" 61 "3 6 8 0 5\n" 62 "4 3 9 0 3\n" 63 "5 7 10 0 3\n" 64 "5 6 11 0 10\n" 65 "5 8 12 0 10\n" 66 "6 8 13 0 8\n" 67 "8 9 14 0 20\n" 68 "8 1 15 0 5\n" 69 "9 5 16 0 5\n" 32 "label\n" 33 "0\n" 34 "1\n" 35 "2\n" 36 "3\n" 37 "4\n" 38 "5\n" 39 "@arcs\n" 40 " lcap ucap\n" 41 "0 1 2 10\n" 42 "0 2 2 6\n" 43 "1 3 4 7\n" 44 "1 4 0 5\n" 45 "2 4 1 3\n" 46 "3 5 3 8\n" 47 "4 5 3 7\n" 70 48 "@attributes\n" 71 "source 1\n" 72 "sink 8\n"; 49 "source 0\n" 50 "sink 5\n"; 51 52 void checkCirculationCompile() 53 { 54 typedef int VType; 55 typedef concepts::Digraph Digraph; 56 57 typedef Digraph::Node Node; 58 typedef Digraph::Arc Arc; 59 typedef concepts::ReadMap<Arc,VType> CapMap; 60 typedef concepts::ReadMap<Node,VType> DeltaMap; 61 typedef concepts::ReadWriteMap<Arc,VType> FlowMap; 62 typedef concepts::WriteMap<Node,bool> BarrierMap; 63 64 typedef Elevator<Digraph, Digraph::Node> Elev; 65 typedef LinkedElevator<Digraph, Digraph::Node> LinkedElev; 66 67 Digraph g; 68 Node n; 69 Arc a; 70 CapMap lcap, ucap; 71 DeltaMap delta; 72 FlowMap flow; 73 BarrierMap bar; 74 75 Circulation<Digraph, CapMap, CapMap, DeltaMap> 76 ::SetFlowMap<FlowMap> 77 ::SetElevator<Elev> 78 ::SetStandardElevator<LinkedElev> 79 ::Create circ_test(g,lcap,ucap,delta); 80 81 circ_test.lowerCapMap(lcap); 82 circ_test.upperCapMap(ucap); 83 circ_test.deltaMap(delta); 84 flow = circ_test.flowMap(); 85 circ_test.flowMap(flow); 86 87 circ_test.init(); 88 circ_test.greedyInit(); 89 circ_test.start(); 90 circ_test.run(); 91 92 circ_test.barrier(n); 93 circ_test.barrierMap(bar); 94 circ_test.flow(a); 95 } 96 97 template <class G, class LM, class UM, class DM> 98 void checkCirculation(const G& g, const LM& lm, const UM& um, 99 const DM& dm, bool find) 100 { 101 Circulation<G, LM, UM, DM> circ(g, lm, um, dm); 102 bool ret = circ.run(); 103 if (find) { 104 check(ret, "A feasible solution should have been found."); 105 check(circ.checkFlow(), "The found flow is corrupt."); 106 check(!circ.checkBarrier(), "A barrier should not have been found."); 107 } else { 108 check(!ret, "A feasible solution should not have been found."); 109 check(circ.checkBarrier(), "The found barrier is corrupt."); 110 } 111 } 73 112 74 113 int main (int, char*[]) 75 114 { 115 typedef ListDigraph Digraph; 116 DIGRAPH_TYPEDEFS(Digraph); 76 117 77 typedef ListDigraph Digraph; 78 typedef Digraph::Node Node; 79 typedef Digraph::NodeIt NodeIt; 80 typedef Digraph::Arc Arc; 81 typedef Digraph::ArcIt ArcIt; 82 typedef Digraph::ArcMap<int> ArcMap; 83 typedef Digraph::NodeMap<int> NodeMap; 84 typedef Digraph::NodeMap<double> DNodeMap; 118 Digraph g; 119 IntArcMap lo(g), up(g); 120 IntNodeMap delta(g, 0); 121 Node s, t; 85 122 86 Digraph g; 87 ArcMap lo(g); 88 ArcMap up(g); 89 NodeMap delta(g); 90 NodeMap nid(g); 91 ArcMap eid(g); 92 Node source, sink; 93 94 std::istringstream input(test_lgf); 95 DigraphReader<Digraph>(g,input). 96 arcMap("lo_cap", lo). 97 arcMap("up_cap", up). 98 nodeMap("delta", delta). 99 arcMap("label", eid). 100 nodeMap("label", nid). 101 node("source",source). 102 node("sink",sink). 103 run(); 123 std::istringstream input(test_lgf); 124 DigraphReader<Digraph>(g,input). 125 arcMap("lcap", lo). 126 arcMap("ucap", up). 127 node("source",s). 128 node("sink",t). 129 run(); 104 130 105 Circulation<Digraph> gen(g,lo,up,delta); 106 bool ret=gen.run(); 107 check(ret,"A feasible solution should have been found."); 108 check(gen.checkFlow(), "The found flow is corrupt."); 109 110 delta[source]=14; 111 delta[sink]=-14; 112 113 bool ret2=gen.run(); 114 check(!ret2,"A feasible solution should not have been found."); 115 check(gen.checkBarrier(), "The found barrier is corrupt."); 131 delta[s] = 7; delta[t] = -7; 132 checkCirculation(g, lo, up, delta, true); 116 133 134 delta[s] = 13; delta[t] = -13; 135 checkCirculation(g, lo, up, delta, true); 136 137 delta[s] = 6; delta[t] = -6; 138 checkCirculation(g, lo, up, delta, false); 139 140 delta[s] = 14; delta[t] = -14; 141 checkCirculation(g, lo, up, delta, false); 142 143 delta[s] = 7; delta[t] = -13; 144 checkCirculation(g, lo, up, delta, true); 145 146 delta[s] = 5; delta[t] = -15; 147 checkCirculation(g, lo, up, delta, true); 148 149 delta[s] = 10; delta[t] = -11; 150 checkCirculation(g, lo, up, delta, true); 151 152 delta[s] = 11; delta[t] = -10; 153 checkCirculation(g, lo, up, delta, false); 154 155 return 0; 117 156 }