kpeter@171: /* -*- C++ -*- kpeter@171: * kpeter@171: * This file is a part of LEMON, a generic C++ optimization library kpeter@171: * kpeter@171: * Copyright (C) 2003-2008 kpeter@171: * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport kpeter@171: * (Egervary Research Group on Combinatorial Optimization, EGRES). kpeter@171: * kpeter@171: * Permission to use, modify and distribute this software is granted kpeter@171: * provided that this copyright notice appears in all copies. For kpeter@171: * precise terms see the accompanying LICENSE file. kpeter@171: * kpeter@171: * This software is provided "AS IS" with no warranty of any kind, kpeter@171: * express or implied, and with no claim as to its suitability for any kpeter@171: * purpose. kpeter@171: * kpeter@171: */ kpeter@171: kpeter@171: #ifndef LEMON_TEST_GRAPH_TEST_H kpeter@171: #define LEMON_TEST_GRAPH_TEST_H kpeter@171: kpeter@171: #include kpeter@171: #include "test_tools.h" kpeter@171: kpeter@171: namespace lemon { kpeter@171: kpeter@171: template kpeter@171: void checkGraphNodeList(const Graph &G, int cnt) kpeter@171: { kpeter@171: typename Graph::NodeIt n(G); kpeter@171: for(int i=0;i kpeter@171: void checkGraphArcList(const Graph &G, int cnt) kpeter@171: { kpeter@171: typename Graph::ArcIt e(G); kpeter@171: for(int i=0;i kpeter@171: void checkGraphOutArcList(const Graph &G, typename Graph::Node n, int cnt) kpeter@171: { kpeter@171: typename Graph::OutArcIt e(G,n); kpeter@171: for(int i=0;i kpeter@171: void checkGraphInArcList(const Graph &G, typename Graph::Node n, int cnt) kpeter@171: { kpeter@171: typename Graph::InArcIt e(G,n); kpeter@171: for(int i=0;i kpeter@171: void checkGraphEdgeList(const Graph &G, int cnt) kpeter@171: { kpeter@171: typename Graph::EdgeIt e(G); kpeter@171: for(int i=0;i kpeter@171: void checkGraphIncEdgeList(const Graph &G, typename Graph::Node n, int cnt) kpeter@171: { kpeter@171: typename Graph::IncEdgeIt e(G,n); kpeter@171: for(int i=0;i kpeter@171: void checkDigraphIterators() { kpeter@171: typedef typename Digraph::Node Node; kpeter@171: typedef typename Digraph::NodeIt NodeIt; kpeter@171: typedef typename Digraph::Arc Arc; kpeter@171: typedef typename Digraph::ArcIt ArcIt; kpeter@171: typedef typename Digraph::InArcIt InArcIt; kpeter@171: typedef typename Digraph::OutArcIt OutArcIt; kpeter@171: } kpeter@171: kpeter@171: template kpeter@171: void checkGraphIterators() { kpeter@171: checkDigraphIterators(); kpeter@171: typedef typename Graph::Edge Edge; kpeter@171: typedef typename Graph::EdgeIt EdgeIt; kpeter@171: typedef typename Graph::IncEdgeIt IncEdgeIt; kpeter@171: } kpeter@171: kpeter@171: // Structure returned by addPetersen() kpeter@171: template kpeter@171: struct PetStruct kpeter@171: { kpeter@171: // Vector containing the outer nodes kpeter@171: std::vector outer; kpeter@171: // Vector containing the inner nodes kpeter@171: std::vector inner; kpeter@171: // Vector containing the arcs of the inner circle kpeter@171: std::vector incir; kpeter@171: // Vector containing the arcs of the outer circle kpeter@171: std::vector outcir; kpeter@171: // Vector containing the chord arcs kpeter@171: std::vector chords; kpeter@171: }; kpeter@171: kpeter@171: // Adds the reverse pair of all arcs to a digraph kpeter@171: template kpeter@171: void bidirDigraph(Digraph &G) kpeter@171: { kpeter@171: typedef typename Digraph::Arc Arc; kpeter@171: typedef typename Digraph::ArcIt ArcIt; kpeter@171: kpeter@171: std::vector ee; kpeter@171: kpeter@171: for(ArcIt e(G);e!=INVALID;++e) ee.push_back(e); kpeter@171: kpeter@171: for(int i=0;i kpeter@171: PetStruct addPetersen(Digraph &G,int num = 5) kpeter@171: { kpeter@171: PetStruct n; kpeter@171: kpeter@171: for(int i=0;i kpeter@171: void checkBidirPetersen(const Digraph &G, int num = 5) kpeter@171: { kpeter@171: typedef typename Digraph::NodeIt NodeIt; kpeter@171: kpeter@171: checkGraphNodeList(G, 2 * num); kpeter@171: checkGraphArcList(G, 6 * num); kpeter@171: kpeter@171: for(NodeIt n(G);n!=INVALID;++n) { kpeter@171: checkGraphInArcList(G, n, 3); kpeter@171: checkGraphOutArcList(G, n, 3); kpeter@171: } kpeter@171: } kpeter@171: kpeter@171: // Structure returned by addUPetersen() kpeter@171: template kpeter@171: struct UPetStruct kpeter@171: { kpeter@171: // Vector containing the outer nodes kpeter@171: std::vector outer; kpeter@171: // Vector containing the inner nodes kpeter@171: std::vector inner; kpeter@171: // Vector containing the edges of the inner circle kpeter@171: std::vector incir; kpeter@171: // Vector containing the edges of the outer circle kpeter@171: std::vector outcir; kpeter@171: // Vector containing the chord edges kpeter@171: std::vector chords; kpeter@171: }; kpeter@171: kpeter@171: // Adds a Petersen graph to \c G. kpeter@171: // Returns the nodes and edges of the generated graph. kpeter@171: template kpeter@171: UPetStruct addUPetersen(Graph &G,int num=5) kpeter@171: { kpeter@171: UPetStruct n; kpeter@171: kpeter@171: for(int i=0;i kpeter@171: void checkUndirPetersen(const Graph &G, int num = 5) kpeter@171: { kpeter@171: typedef typename Graph::NodeIt NodeIt; kpeter@171: kpeter@171: checkGraphNodeList(G, 2 * num); kpeter@171: checkGraphEdgeList(G, 3 * num); kpeter@171: checkGraphArcList(G, 6 * num); kpeter@171: kpeter@171: for(NodeIt n(G);n!=INVALID;++n) { kpeter@171: checkGraphIncEdgeList(G, n, 3); kpeter@171: } kpeter@171: } kpeter@171: kpeter@171: template kpeter@171: void checkDigraph() { kpeter@171: const int num = 5; kpeter@171: Digraph G; kpeter@171: checkGraphNodeList(G, 0); kpeter@171: checkGraphArcList(G, 0); kpeter@171: addPetersen(G, num); kpeter@171: bidirDigraph(G); kpeter@171: checkBidirPetersen(G, num); kpeter@171: } kpeter@171: kpeter@171: template kpeter@171: void checkGraph() { kpeter@171: const int num = 5; kpeter@171: Graph G; kpeter@171: checkGraphNodeList(G, 0); kpeter@171: checkGraphEdgeList(G, 0); kpeter@171: addUPetersen(G, num); kpeter@171: checkUndirPetersen(G, num); kpeter@171: } kpeter@171: kpeter@171: } //namespace lemon kpeter@171: kpeter@171: #endif