/* -*- mode: C++; indent-tabs-mode: nil; -*- * * This file is a part of LEMON, a generic C++ optimization library. * * Copyright (C) 2003-2008 * 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. * */ #ifndef LEMON_TEST_GRAPH_TEST_H #define LEMON_TEST_GRAPH_TEST_H #include #include "test_tools.h" namespace lemon { template void checkGraphNodeList(const Graph &G, int cnt) { typename Graph::NodeIt n(G); for(int i=0;i void checkGraphArcList(const Graph &G, int cnt) { typename Graph::ArcIt e(G); for(int i=0;i void checkGraphOutArcList(const Graph &G, typename Graph::Node n, int cnt) { typename Graph::OutArcIt e(G,n); for(int i=0;i void checkGraphInArcList(const Graph &G, typename Graph::Node n, int cnt) { typename Graph::InArcIt e(G,n); for(int i=0;i void checkGraphEdgeList(const Graph &G, int cnt) { typename Graph::EdgeIt e(G); for(int i=0;i void checkGraphIncEdgeList(const Graph &G, typename Graph::Node n, int cnt) { typename Graph::IncEdgeIt e(G,n); for(int i=0;i void checkDigraphIterators() { typedef typename Digraph::Node Node; typedef typename Digraph::NodeIt NodeIt; typedef typename Digraph::Arc Arc; typedef typename Digraph::ArcIt ArcIt; typedef typename Digraph::InArcIt InArcIt; typedef typename Digraph::OutArcIt OutArcIt; } template void checkGraphIterators() { checkDigraphIterators(); typedef typename Graph::Edge Edge; typedef typename Graph::EdgeIt EdgeIt; typedef typename Graph::IncEdgeIt IncEdgeIt; } // Structure returned by addPetersen() template struct PetStruct { // Vector containing the outer nodes std::vector outer; // Vector containing the inner nodes std::vector inner; // Vector containing the arcs of the inner circle std::vector incir; // Vector containing the arcs of the outer circle std::vector outcir; // Vector containing the chord arcs std::vector chords; }; // Adds the reverse pair of all arcs to a digraph template void bidirDigraph(Digraph &G) { typedef typename Digraph::Arc Arc; typedef typename Digraph::ArcIt ArcIt; std::vector ee; for(ArcIt e(G);e!=INVALID;++e) ee.push_back(e); for(int i=0;i PetStruct addPetersen(Digraph &G,int num = 5) { PetStruct n; for(int i=0;i void checkBidirPetersen(const Digraph &G, int num = 5) { typedef typename Digraph::NodeIt NodeIt; checkGraphNodeList(G, 2 * num); checkGraphArcList(G, 6 * num); for(NodeIt n(G);n!=INVALID;++n) { checkGraphInArcList(G, n, 3); checkGraphOutArcList(G, n, 3); } } // Structure returned by addUPetersen() template struct UPetStruct { // Vector containing the outer nodes std::vector outer; // Vector containing the inner nodes std::vector inner; // Vector containing the edges of the inner circle std::vector incir; // Vector containing the edges of the outer circle std::vector outcir; // Vector containing the chord edges std::vector chords; }; // Adds a Petersen graph to \c G. // Returns the nodes and edges of the generated graph. template UPetStruct addUPetersen(Graph &G,int num=5) { UPetStruct n; for(int i=0;i void checkUndirPetersen(const Graph &G, int num = 5) { typedef typename Graph::NodeIt NodeIt; checkGraphNodeList(G, 2 * num); checkGraphEdgeList(G, 3 * num); checkGraphArcList(G, 6 * num); for(NodeIt n(G);n!=INVALID;++n) { checkGraphIncEdgeList(G, n, 3); } } template void checkDigraph() { const int num = 5; Digraph G; checkGraphNodeList(G, 0); checkGraphArcList(G, 0); addPetersen(G, num); bidirDigraph(G); checkBidirPetersen(G, num); } template void checkGraph() { const int num = 5; Graph G; checkGraphNodeList(G, 0); checkGraphEdgeList(G, 0); addUPetersen(G, num); checkUndirPetersen(G, num); } } //namespace lemon #endif