1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
3 * This file is a part of LEMON, a generic C++ optimization library.
5 * Copyright (C) 2003-2010
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
9 * Permission to use, modify and distribute this software is granted
10 * provided that this copyright notice appears in all copies. For
11 * precise terms see the accompanying LICENSE file.
13 * This software is provided "AS IS" with no warranty of any kind,
14 * express or implied, and with no claim as to its suitability for any
21 #include "test_tools.h"
22 #include <lemon/list_graph.h>
23 #include <lemon/circulation.h>
24 #include <lemon/lgf_reader.h>
25 #include <lemon/concepts/digraph.h>
26 #include <lemon/concepts/maps.h>
28 using namespace lemon;
52 void checkCirculationCompile()
55 typedef concepts::Digraph Digraph;
57 typedef Digraph::Node Node;
58 typedef Digraph::Arc Arc;
59 typedef concepts::ReadMap<Arc,VType> CapMap;
60 typedef concepts::ReadMap<Node,VType> SupplyMap;
61 typedef concepts::ReadWriteMap<Arc,VType> FlowMap;
62 typedef concepts::WriteMap<Node,bool> BarrierMap;
64 typedef Elevator<Digraph, Digraph::Node> Elev;
65 typedef LinkedElevator<Digraph, Digraph::Node> LinkedElev;
77 typedef Circulation<Digraph, CapMap, CapMap, SupplyMap>
80 ::SetStandardElevator<LinkedElev>
81 ::Create CirculationType;
82 CirculationType circ_test(g, lcap, ucap, supply);
83 const CirculationType& const_circ_test = circ_test;
91 const CirculationType::Elevator& elev = const_circ_test.elevator();
92 circ_test.elevator(const_cast<CirculationType::Elevator&>(elev));
93 CirculationType::Tolerance tol = const_circ_test.tolerance();
94 circ_test.tolerance(tol);
97 circ_test.greedyInit();
101 v = const_circ_test.flow(a);
102 const FlowMap& fm = const_circ_test.flowMap();
103 b = const_circ_test.barrier(n);
104 const_circ_test.barrierMap(bar);
106 ignore_unused_variable_warning(fm);
109 template <class G, class LM, class UM, class DM>
110 void checkCirculation(const G& g, const LM& lm, const UM& um,
111 const DM& dm, bool find)
113 Circulation<G, LM, UM, DM> circ(g, lm, um, dm);
114 bool ret = circ.run();
116 check(ret, "A feasible solution should have been found.");
117 check(circ.checkFlow(), "The found flow is corrupt.");
118 check(!circ.checkBarrier(), "A barrier should not have been found.");
120 check(!ret, "A feasible solution should not have been found.");
121 check(circ.checkBarrier(), "The found barrier is corrupt.");
125 int main (int, char*[])
127 typedef ListDigraph Digraph;
128 DIGRAPH_TYPEDEFS(Digraph);
131 IntArcMap lo(g), up(g);
132 IntNodeMap delta(g, 0);
135 std::istringstream input(test_lgf);
136 DigraphReader<Digraph>(g,input).
143 delta[s] = 7; delta[t] = -7;
144 checkCirculation(g, lo, up, delta, true);
146 delta[s] = 13; delta[t] = -13;
147 checkCirculation(g, lo, up, delta, true);
149 delta[s] = 6; delta[t] = -6;
150 checkCirculation(g, lo, up, delta, false);
152 delta[s] = 14; delta[t] = -14;
153 checkCirculation(g, lo, up, delta, false);
155 delta[s] = 7; delta[t] = -13;
156 checkCirculation(g, lo, up, delta, true);
158 delta[s] = 5; delta[t] = -15;
159 checkCirculation(g, lo, up, delta, true);
161 delta[s] = 10; delta[t] = -11;
162 checkCirculation(g, lo, up, delta, true);
164 delta[s] = 11; delta[t] = -10;
165 checkCirculation(g, lo, up, delta, false);