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 |
|