/* -*- 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 #include "test_tools.h" #include #include #include #include #include #include using namespace lemon; using namespace std; char test_lgf[] = "@nodes\n" "label\n" "0\n" "1\n" "2\n" "3\n" "@arcs\n" " label capacity\n" "0 1 0 2\n" "1 0 1 2\n" "2 1 2 1\n" "2 3 3 3\n" "3 2 4 3\n" "3 1 5 5\n" "@attributes\n" "s 0\n" "x 1\n" "y 2\n" "z 3\n"; void checkMaxCardSearchCompile() { typedef concepts::Digraph Digraph; typedef int Value; typedef Digraph::Node Node; typedef Digraph::Arc Arc; typedef concepts::ReadMap CapMap; typedef concepts::ReadWriteMap CardMap; typedef concepts::ReadWriteMap ProcMap; typedef Digraph::NodeMap HeapCrossRef; Digraph g; Node n,s; CapMap cap; CardMap card; ProcMap proc; HeapCrossRef crossref(g); typedef MaxCardinalitySearch ::SetCapacityMap ::SetCardinalityMap ::SetProcessedMap ::SetStandardHeap > ::Create MaxCardType; MaxCardType maxcard(g,cap); const MaxCardType& const_maxcard = maxcard; const MaxCardType::Heap& heap_const = const_maxcard.heap(); MaxCardType::Heap& heap = const_cast(heap_const); maxcard.heap(heap,crossref); maxcard.capacityMap(cap).cardinalityMap(card).processedMap(proc); maxcard.init(); maxcard.addSource(s); n = maxcard.nextNode(); maxcard.processNextNode(); maxcard.start(); maxcard.run(s); maxcard.run(); } void checkWithIntMap( std::istringstream& input) { typedef SmartDigraph Digraph; typedef Digraph::Node Node; typedef Digraph::ArcMap CapMap; Digraph g; Node s,x,y,z,a; CapMap cap(g); DigraphReader(g,input). arcMap("capacity", cap). node("s",s). node("x",x). node("y",y). node("z",z). run(); MaxCardinalitySearch maxcard(g,cap); maxcard.init(); maxcard.addSource(s); maxcard.start(x); check(maxcard.processed(s) && !maxcard.processed(x) && !maxcard.processed(y), "Wrong processed()!"); a=maxcard.nextNode(); check(maxcard.processNextNode()==a, "Wrong nextNode() or processNextNode() return value!"); check(maxcard.processed(a), "Wrong processNextNode()!"); maxcard.start(); check(maxcard.cardinality(x)==2 && maxcard.cardinality(y)>=4, "Wrong cardinalities!"); } void checkWithConst1Map(std::istringstream &input) { typedef SmartDigraph Digraph; typedef Digraph::Node Node; Digraph g; Node s,x,y,z; DigraphReader(g,input). node("s",s). node("x",x). node("y",y). node("z",z). run(); MaxCardinalitySearch maxcard(g); maxcard.run(s); check(maxcard.cardinality(x)==1 && maxcard.cardinality(y)+maxcard.cardinality(z)==3, "Wrong cardinalities!"); } int main() { std::istringstream input1(test_lgf); checkWithIntMap(input1); std::istringstream input2(test_lgf); checkWithConst1Map(input2); }