diff --git a/test/heap_test.cc b/test/heap_test.cc --- a/test/heap_test.cc +++ b/test/heap_test.cc @@ -24,113 +24,163 @@ #include #include -#include +#include -#include +#include +#include +#include #include -#include -#include -#include #include "test_tools.h" -#include "heap_test.h" - -#include - using namespace lemon; using namespace lemon::concepts; +typedef ListDigraph Digraph; +DIGRAPH_TYPEDEFS(Digraph); + +char test_lgf[] = + "@nodes\n" + "label\n" + "0\n" + "1\n" + "2\n" + "3\n" + "4\n" + "5\n" + "6\n" + "7\n" + "8\n" + "9\n" + "@arcs\n" + " label capacity\n" + "0 5 0 94\n" + "3 9 1 11\n" + "8 7 2 83\n" + "1 2 3 94\n" + "5 7 4 35\n" + "7 4 5 84\n" + "9 5 6 38\n" + "0 4 7 96\n" + "6 7 8 6\n" + "3 1 9 27\n" + "5 2 10 77\n" + "5 6 11 69\n" + "6 5 12 41\n" + "4 6 13 70\n" + "3 2 14 45\n" + "7 9 15 93\n" + "5 9 16 50\n" + "9 0 17 94\n" + "9 6 18 67\n" + "0 9 19 86\n" + "@attributes\n" + "source 3\n"; + +int test_seq[] = { 2, 28, 19, 27, 33, 25, 13, 41, 10, 26, 1, 9, 4, 34}; +int test_inc[] = {20, 28, 34, 16, 0, 46, 44, 0, 42, 32, 14, 8, 6, 37}; + +int test_len = sizeof(test_seq) / sizeof(test_seq[0]); + +template +void heapSortTest() { + RangeMap map(test_len, -1); + + Heap heap(map); + + std::vector v(test_len); + + for (int i = 0; i < test_len; ++i) { + v[i] = test_seq[i]; + heap.push(i, v[i]); + } + std::sort(v.begin(), v.end()); + for (int i = 0; i < test_len; ++i) { + check(v[i] == heap.prio() ,"Wrong order in heap sort."); + heap.pop(); + } +} + +template +void heapIncreaseTest() { + RangeMap map(test_len, -1); + + Heap heap(map); + + std::vector v(test_len); + + for (int i = 0; i < test_len; ++i) { + v[i] = test_seq[i]; + heap.push(i, v[i]); + } + for (int i = 0; i < test_len; ++i) { + v[i] += test_inc[i]; + heap.increase(i, v[i]); + } + std::sort(v.begin(), v.end()); + for (int i = 0; i < test_len; ++i) { + check(v[i] == heap.prio() ,"Wrong order in heap increase test."); + heap.pop(); + } +} + + + +template +void dijkstraHeapTest(const Digraph& digraph, const IntArcMap& length, + Node source) { + + typename Dijkstra::template DefStandardHeap:: + Create dijkstra(digraph, length); + + dijkstra.run(source); + + for(ArcIt a(digraph); a != INVALID; ++a) { + Node s = digraph.source(a); + Node t = digraph.target(a); + if (dijkstra.reached(s)) { + check( dijkstra.dist(t) - dijkstra.dist(s) <= length[a], + "Error in a shortest path tree!"); + } + } + + for(NodeIt n(digraph); n != INVALID; ++n) { + if ( dijkstra.reached(n) && dijkstra.predArc(n) != INVALID ) { + Arc a = dijkstra.predArc(n); + Node s = digraph.source(a); + check( dijkstra.dist(n) - dijkstra.dist(s) == length[a], + "Error in a shortest path tree!"); + } + } + +} + int main() { typedef int Item; typedef int Prio; - typedef IntIntMap ItemIntMap; + typedef RangeMap ItemIntMap; + + Digraph digraph; + IntArcMap length(digraph); + Node source; - typedef ListDigraph Digraph; - - typedef Digraph::Arc Arc; - typedef Digraph::Node Node; - typedef Digraph::ArcIt ArcIt; - typedef Digraph::NodeIt NodeIt; - typedef Digraph::ArcMap LengthMap; - - Digraph digraph; - LengthMap length(digraph); - Node start; - - /// \todo create own test digraph - - std::string f_name; - if( getenv("srcdir") ) - f_name = std::string(getenv("srcdir")); - else f_name = "."; - f_name += "/test/dijkstra_test.lgf"; - - std::ifstream input(f_name.c_str()); - check(input, "Input file '" << f_name << "' not found."); - DigraphReader(input, digraph). - readArcMap("capacity", length). - readNode("source", start). + std::istringstream input(test_lgf); + digraphReader(input, digraph). + arcMap("capacity", length). + node("source", source). run(); { - std::cout << "Checking Bin Heap" << std::endl; - typedef BinHeap IntHeap; checkConcept, IntHeap>(); - heapSortTest(100); - heapIncreaseTest(100); + heapSortTest(); + heapIncreaseTest(); - typedef FibHeap > NodeHeap; - checkConcept >, NodeHeap>(); - Timer timer; - dijkstraHeapTest(digraph, length, start); - std::cout << timer << std::endl; - } - { - std::cout << "Checking Fib Heap" << std::endl; - - typedef FibHeap IntHeap; - checkConcept, IntHeap>(); - heapSortTest(100); - heapIncreaseTest(100); - - typedef FibHeap > NodeHeap; - checkConcept >, NodeHeap>(); - Timer timer; - dijkstraHeapTest(digraph, length, start); - std::cout << timer << std::endl; - } - { - std::cout << "Checking Radix Heap" << std::endl; - - typedef RadixHeap IntHeap; - checkConcept, IntHeap>(); - heapSortTest(100); - heapIncreaseTest(100); - - typedef RadixHeap > NodeHeap; - checkConcept >, NodeHeap>(); - Timer timer; - dijkstraHeapTest(digraph, length, start); - std::cout << timer << std::endl; - } - - { - std::cout << "Checking Bucket Heap" << std::endl; - - typedef BucketHeap IntHeap; - checkConcept, IntHeap>(); - heapSortTest(100); - heapIncreaseTest(100); - - typedef BucketHeap > NodeHeap; - checkConcept >, NodeHeap>(); - Timer timer; - dijkstraHeapTest(digraph, length, start); - std::cout << timer << std::endl; + typedef BinHeap NodeHeap; + checkConcept, NodeHeap>(); + dijkstraHeapTest(digraph, length, source); } return 0;