/* -*- mode: C++; indent-tabs-mode: nil; -*- * * This file is a part of LEMON, a generic C++ optimization library. * * Copyright (C) 2003-2009 * 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 #include "test_tools.h" #include #include #include #include #include using namespace lemon; char test_lgf[] = "@nodes\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 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 CapMap; typedef concepts::ReadMap SupplyMap; typedef concepts::ReadWriteMap FlowMap; typedef concepts::WriteMap BarrierMap; typedef Elevator Elev; typedef LinkedElevator LinkedElev; Digraph g; Node n; Arc a; CapMap lcap, ucap; SupplyMap supply; FlowMap flow; BarrierMap bar; VType v; bool b; typedef Circulation ::SetFlowMap ::SetElevator ::SetStandardElevator ::Create CirculationType; CirculationType circ_test(g, lcap, ucap, supply); const CirculationType& const_circ_test = circ_test; circ_test .lowerMap(lcap) .upperMap(ucap) .supplyMap(supply) .flowMap(flow); const CirculationType::Elevator& elev = const_circ_test.elevator(); circ_test.elevator(const_cast(elev)); CirculationType::Tolerance tol = const_circ_test.tolerance(); circ_test.tolerance(tol); circ_test.init(); circ_test.greedyInit(); circ_test.start(); circ_test.run(); v = const_circ_test.flow(a); const FlowMap& fm = const_circ_test.flowMap(); b = const_circ_test.barrier(n); const_circ_test.barrierMap(bar); ignore_unused_variable_warning(fm); } template void checkCirculation(const G& g, const LM& lm, const UM& um, const DM& dm, bool find) { Circulation 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); Digraph g; IntArcMap lo(g), up(g); IntNodeMap delta(g, 0); Node s, t; std::istringstream input(test_lgf); DigraphReader(g,input). arcMap("lcap", lo). arcMap("ucap", up). node("source",s). node("sink",t). run(); 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; }