test/digraph_test.h
 author Akos Ladanyi Tue, 22 Apr 2008 18:12:58 +0200 changeset 153 976a014b3797 parent 57 c1acf0018c0a permissions -rw-r--r--
Convert the EPS files to PNG when generating the documentation
     1 /* -*- C++ -*-

     2  *

     3  * This file is a part of LEMON, a generic C++ optimization library

     4  *

     5  * Copyright (C) 2003-2008

     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport

     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).

     8  *

     9  * Permission to use, modify and distribute this software is granted

    10  * provided that this copyright notice appears in all copies. For

    11  * precise terms see the accompanying LICENSE file.

    12  *

    13  * This software is provided "AS IS" with no warranty of any kind,

    14  * express or implied, and with no claim as to its suitability for any

    15  * purpose.

    16  *

    17  */

    18

    19 #ifndef LEMON_TEST_GRAPH_TEST_H

    20 #define LEMON_TEST_GRAPH_TEST_H

    21

    22 //#include <lemon/graph_utils.h>

    23 #include "test_tools.h"

    24

    25 //! \ingroup misc

    26 //! \file

    27 //! \brief Some utility and test cases to test digraph classes.

    28 namespace lemon {

    29

    30   ///Structure returned by \ref addPetersen().

    31

    32   ///Structure returned by \ref addPetersen().

    33   ///

    34   template<class Digraph>

    35   struct PetStruct

    36   {

    37     ///Vector containing the outer nodes.

    38     std::vector<typename Digraph::Node> outer;

    39     ///Vector containing the inner nodes.

    40     std::vector<typename Digraph::Node> inner;

    41     ///Vector containing the edges of the inner circle.

    42     std::vector<typename Digraph::Arc> incir;

    43     ///Vector containing the edges of the outer circle.

    44     std::vector<typename Digraph::Arc> outcir;

    45     ///Vector containing the chord edges.

    46     std::vector<typename Digraph::Arc> chords;

    47   };

    48

    49

    50

    51   ///Adds a Petersen graph to \c G.

    52

    53   ///Adds a Petersen graph to \c G.

    54   ///\return The nodes and edges of the generated graph.

    55

    56   template<typename Digraph>

    57   PetStruct<Digraph> addPetersen(Digraph &G,int num = 5)

    58   {

    59     PetStruct<Digraph> n;

    60

    61     for(int i=0;i<num;i++) {

    62       n.outer.push_back(G.addNode());

    63       n.inner.push_back(G.addNode());

    64     }

    65

    66     for(int i=0;i<num;i++) {

    67       n.chords.push_back(G.addArc(n.outer[i],n.inner[i]));

    68       n.outcir.push_back(G.addArc(n.outer[i],n.outer[(i+1) % num]));

    69       n.incir.push_back(G.addArc(n.inner[i],n.inner[(i+2) % num]));

    70     }

    71     return n;

    72   }

    73

    74   /// \brief Adds to the digraph the reverse pair of all edges.

    75   ///

    76   /// Adds to the digraph the reverse pair of all edges.

    77   ///

    78   template<class Digraph>

    79   void bidirDigraph(Digraph &G)

    80   {

    81     typedef typename Digraph::Arc Arc;

    82     typedef typename Digraph::ArcIt ArcIt;

    83

    84     std::vector<Arc> ee;

    85

    86     for(ArcIt e(G);e!=INVALID;++e) ee.push_back(e);

    87

    88     for(typename std::vector<Arc>::iterator p=ee.begin();p!=ee.end();p++)

    89       G.addArc(G.target(*p),G.source(*p));

    90   }

    91

    92

    93   /// \brief Checks the bidirectioned Petersen graph.

    94   ///

    95   ///  Checks the bidirectioned Petersen graph.

    96   ///

    97   template<class Digraph>

    98   void checkBidirPetersen(Digraph &G, int num = 5)

    99   {

   100     typedef typename Digraph::Node Node;

   101

   102     typedef typename Digraph::ArcIt ArcIt;

   103     typedef typename Digraph::NodeIt NodeIt;

   104

   105     checkDigraphNodeList(G, 2 * num);

   106     checkDigraphArcList(G, 6 * num);

   107

   108     for(NodeIt n(G);n!=INVALID;++n) {

   109       checkDigraphInArcList(G, n, 3);

   110       checkDigraphOutArcList(G, n, 3);

   111     }

   112   }

   113

   114   template<class Digraph> void checkDigraphNodeList(Digraph &G, int nn)

   115   {

   116     typename Digraph::NodeIt n(G);

   117     for(int i=0;i<nn;i++) {

   118       check(n!=INVALID,"Wrong Node list linking.");

   119       ++n;

   120     }

   121     check(n==INVALID,"Wrong Node list linking.");

   122   }

   123

   124   template<class Digraph>

   125   void checkDigraphArcList(Digraph &G, int nn)

   126   {

   127     typedef typename Digraph::ArcIt ArcIt;

   128

   129     ArcIt e(G);

   130     for(int i=0;i<nn;i++) {

   131       check(e!=INVALID,"Wrong Arc list linking.");

   132       ++e;

   133     }

   134     check(e==INVALID,"Wrong Arc list linking.");

   135   }

   136

   137   template<class Digraph>

   138   void checkDigraphOutArcList(Digraph &G, typename Digraph::Node n, int nn)

   139   {

   140     typename Digraph::OutArcIt e(G,n);

   141     for(int i=0;i<nn;i++) {

   142       check(e!=INVALID,"Wrong OutArc list linking.");

   143       check(n==G.source(e), "Wrong OutArc list linking.");

   144       ++e;

   145     }

   146     check(e==INVALID,"Wrong OutArc list linking.");

   147   }

   148

   149   template<class Digraph> void

   150   checkDigraphInArcList(Digraph &G, typename Digraph::Node n, int nn)

   151   {

   152     typename Digraph::InArcIt e(G,n);

   153     for(int i=0;i<nn;i++) {

   154       check(e!=INVALID,"Wrong InArc list linking.");

   155       check(n==G.target(e), "Wrong InArc list linking.");

   156       ++e;

   157     }

   158     check(e==INVALID,"Wrong InArc list linking.");

   159   }

   160

   161   template <class Digraph>

   162   void checkDigraph() {

   163     const int num = 5;

   164     Digraph G;

   165     addPetersen(G, num);

   166     bidirDigraph(G);

   167     checkBidirPetersen(G, num);

   168   }

   169

   170   template <class Digraph>

   171   void checkDigraphIterators(const Digraph& digraph) {

   172     typedef typename Digraph::Node Node;

   173     typedef typename Digraph::NodeIt NodeIt;

   174     typedef typename Digraph::Arc Arc;

   175     typedef typename Digraph::ArcIt ArcIt;

   176     typedef typename Digraph::InArcIt InArcIt;

   177     typedef typename Digraph::OutArcIt OutArcIt;

   178     //    typedef ConArcIt<Digraph> ConArcIt;

   179   }

   180

   181   ///\file

   182   ///\todo Check target(), source() as well;

   183

   184

   185 } //namespace lemon

   186

   187

   188 #endif