]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/graph/test/graph.cpp
1 //=======================================================================
2 // Copyright 2002 Indiana University.
3 // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
5 // Distributed under the Boost Software License, Version 1.0. (See
6 // accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
8 //=======================================================================
10 #include <boost/config.hpp>
20 #include <boost/utility.hpp>
21 #include <boost/graph/graph_utility.hpp>
22 #include <boost/graph/random.hpp>
23 #include <boost/pending/indirect_cmp.hpp>
25 #include <boost/random/mersenne_twister.hpp>
28 enum vertex_id_t
{ vertex_id
= 500 };
29 enum edge_id_t
{ edge_id
= 501 };
31 BOOST_INSTALL_PROPERTY(vertex
, id
);
32 BOOST_INSTALL_PROPERTY(edge
, id
);
36 #include "graph_type.hpp" // this provides a typedef for Graph
38 using namespace boost
;
41 This program tests models of the MutableGraph concept.
50 template <class Graph
, class Vertex
, class ID
>
51 bool check_vertex_cleared(Graph
& g
, Vertex v
, ID id
)
53 typename graph_traits
<Graph
>::vertex_iterator vi
, viend
;
54 for (boost::tie(vi
,viend
) = vertices(g
); vi
!= viend
; ++vi
) {
55 typename graph_traits
<Graph
>::adjacency_iterator ai
, aiend
, found
;
56 boost::tie(ai
, aiend
) = adjacent_vertices(*vi
, g
);
57 boost::indirect_cmp
<ID
, std::equal_to
<std::size_t> > cmp(id
);
59 #if (defined(BOOST_MSVC) && BOOST_MSVC <= 1300) && defined(__SGI_STL_PORT)
60 // seeing internal compiler errors when using std::find_if()
62 for ( ; ai
!= aiend
; ++ai
)
67 #elif defined(BOOST_NO_CXX98_BINDERS)
68 found
= std::find_if(ai
, aiend
, std::bind(cmp
,v
,std::placeholders::_1
));
70 found
= std::find_if(ai
, aiend
, std::bind1st(cmp
,v
));
73 if ( found
!= aiend
) {
75 std::cerr
<< "should not have found vertex " << id
[*found
] << std::endl
;
83 template <class Graph
, class Edge
, class EdgeID
>
84 bool check_edge_added(Graph
& g
, Edge e
,
85 typename graph_traits
<Graph
>::vertex_descriptor a
,
86 typename graph_traits
<Graph
>::vertex_descriptor b
,
87 EdgeID edge_id
, std::size_t correct_id
,
90 if (! (source(e
, g
) == a
)) {
92 cerr
<< " Failed, vertex a not source of e."<< endl
;
95 } else if (! (target(e
, g
) == b
)) {
97 cerr
<< " Failed, vertex b not source of e."<< endl
;
100 } else if (! is_adjacent(g
, a
, b
)) {
102 cerr
<< " Failed, not adj."<< endl
;
105 } else if (! in_edge_set(g
,e
)) {
107 cerr
<< " Failed, not in edge set."<< endl
;
110 } else if (inserted
&& edge_id
[e
] != correct_id
) {
112 cerr
<< " Failed, invalid edge property."<< endl
;
115 } else if (!inserted
&& edge_id
[e
] != edge_id
[edge(a
, b
, g
).first
]) {
117 cerr
<< " Failed, invalid edge property."<< endl
;
120 } else if (num_edges(g
) != count_edges(g
)) {
122 cerr
<< " Failed, invalid number of edges."<< endl
;
130 template <class Graph
>
131 std::size_t count_edges(Graph
& g
)
134 typename
boost::graph_traits
<Graph
>::edge_iterator ei
,ei_end
;
135 for (boost::tie(ei
,ei_end
) = edges(g
); ei
!= ei_end
; ++ei
)
141 int main(int, char* [])
144 std::size_t N
= 5, E
= 0;
147 typedef ::Graph Graph
;
149 typedef boost::graph_traits
<Graph
>::vertex_descriptor Vertex
;
150 typedef boost::graph_traits
<Graph
>::edge_descriptor Edge
;
153 std::size_t current_vertex_id
= 0;
154 std::size_t current_edge_id
= 0;
156 bool is_failed
= false;
158 property_map
<Graph
, vertex_id_t
>::type vertex_id_map
= get(vertex_id
, g
);
160 property_map
<Graph
, edge_id_t
>::type edge_id_map
= get(edge_id
, g
);
162 for (std::size_t k
= 0; k
< N
; ++k
)
163 add_vertex(current_vertex_id
++, g
);
165 // also need to test EdgeIterator graph constructor -JGS
168 for (j
=0; j
< 10; ++j
) {
172 cerr
<< "Testing add_edge ..." << endl
;
174 for (i
=0; i
< 6; ++i
) {
176 a
= random_vertex(g
, gen
);
178 b
= random_vertex(g
, gen
);
179 } while ( a
== b
); // don't do self edges
181 cerr
<< "add_edge(" << vertex_id_map
[a
] << "," << vertex_id_map
[b
] <<")" << endl
;
185 boost::tie(e
, inserted
) = add_edge(a
, b
, current_edge_id
++, g
);
187 std::cout
<< "inserted: " << inserted
<< std::endl
;
188 std::cout
<< "source(e,g)" << source(e
,g
) << endl
;
189 std::cout
<< "target(e,g)" << target(e
,g
) << endl
;
190 std::cout
<< "edge_id[e] = " << edge_id_map
[e
] << std::endl
;
191 print_edges2(g
, vertex_id_map
, edge_id_map
);
192 print_graph(g
, vertex_id_map
);
193 std::cout
<< "finished printing" << std::endl
;
194 // print_in_edges(g, vertex_id_map);
196 if (! check_edge_added(g
, e
, a
, b
, edge_id_map
,
197 current_edge_id
- 1, inserted
)) {
204 // remove_edge(u, v, g)
206 cerr
<< "Testing remove_edge(u, v, g) ..." << endl
; is_failed
= false;
208 for (i
= 0; i
< 2; ++i
) {
210 print_edges(g
, vertex_id_map
);
214 Edge e
= random_edge(g
, gen
);
215 boost::tie(a
,b
) = boost::incident(e
, g
);
218 cerr
<< "remove_edge(" << vertex_id_map
[a
] << "," << vertex_id_map
[b
] << ")" << endl
;
220 remove_edge(a
, b
, g
);
222 print_graph(g
, vertex_id_map
);
223 // print_in_edges(g, vertex_id_map);
224 print_edges(g
, vertex_id_map
);
226 is_failed
= is_failed
|| is_adjacent(g
, a
, b
) || in_edge_set(g
, a
, b
)
227 || num_edges(g
) != count_edges(g
);
234 cerr
<< " Failed."<< endl
;
238 cerr
<< " Passed."<< endl
;
244 cerr
<< "Testing remove_edge(e, g) ..." << endl
; is_failed
= false;
246 for (i
= 0; i
< 2; ++i
) {
248 print_edges(g
, vertex_id_map
);
251 Edge e
= random_edge(g
, gen
);
252 boost::tie(a
,b
) = boost::incident(e
, g
);
255 cerr
<< "remove_edge(" << vertex_id_map
[a
] << "," << vertex_id_map
[b
] << ")" << endl
;
257 graph_traits
<Graph
>::edges_size_type old_E
= num_edges(g
);
261 print_graph(g
, vertex_id_map
);
262 // print_in_edges(g, vertex_id_map);
263 print_edges(g
, vertex_id_map
);
266 is_failed
= is_failed
|| old_E
!= num_edges(g
) + 1
267 || num_edges(g
) != count_edges(g
);
274 cerr
<< " Failed."<< endl
;
278 cerr
<< " Passed."<< endl
;
284 cerr
<< "Testing add_vertex ..." << endl
; is_failed
= false;
286 old_N
= num_vertices(g
);
287 graph_traits
<Graph
>::vertex_descriptor vid
= add_vertex(g
),
288 vidp1
= add_vertex(g
);
289 vertex_id_map
[vid
] = current_vertex_id
++;
290 vertex_id_map
[vidp1
] = current_vertex_id
++;
293 print_vertices(g
,vertex_id_map
);
294 print_graph(g
,vertex_id_map
);
295 // print_in_edges(g,vertex_id_map);
296 print_edges(g
,vertex_id_map
);
298 // make sure the two added vertices are in the graph's vertex set
300 if (!in_vertex_set(g
, vid
)) {
302 cerr
<< " Failed, " << vertex_id_map
[vid
] << " not in vertices(g)" << endl
;
307 if (!in_vertex_set(g
, vidp1
)) {
309 cerr
<< " Failed, " << vertex_id_map
[vidp1
] << " not in vertices(g)" << endl
;
316 // make sure the vertices do not have any out edges yet
318 graph_traits
<Graph
>::out_edge_iterator e
, e_end
;
319 boost::tie(e
,e_end
) = out_edges(vid
,g
);
322 cerr
<< " Failed, " << vertex_id_map
[vid
]
323 << " should not have any out-edges yet" << endl
;
328 boost::tie(e
,e_end
) = out_edges(vidp1
,g
);
331 cerr
<< " Failed, " << vertex_id_map
[vidp1
]
332 << " should not have any out-edges yet" << endl
;
339 // make sure the vertices do not yet appear in any of the edges
341 graph_traits
<Graph
>::edge_iterator e
, e_end
;
342 for (boost::tie(e
, e_end
) = edges(g
); e
!= e_end
; ++e
) {
343 if (source(*e
,g
) == vid
|| target(*e
,g
) == vid
) {
345 cerr
<< " Failed, " << vertex_id_map
[vid
]
346 << " should not have any edges" << endl
;
351 if (source(*e
,g
) == vidp1
|| target(*e
,g
) == vidp1
) {
353 cerr
<< " Failed, " << vertex_id_map
[vidp1
]
354 << " should not have any edges" << endl
;
361 // Make sure num_vertices(g) has been updated
363 if ( (N
- 2) != old_N
) {
366 cerr
<< " Failed. N = " << N
367 << " but should be " << old_N
+ 2 << endl
;
372 cerr
<< " Passed."<< endl
;
377 cerr
<< "Testing add_edge after add_vertex ..." << endl
; is_failed
= false;
380 for (i
=0; i
<2; ++i
) {
381 Vertex a
= random_vertex(g
, gen
), b
= random_vertex(g
, gen
);
382 while ( a
== vid
) a
= random_vertex(g
, gen
);
383 while ( b
== vidp1
) b
= random_vertex(g
, gen
);
387 cerr
<< "add_edge(" << vertex_id_map
[vid
] << "," << vertex_id_map
[a
] <<")" << endl
;
389 boost::tie(e
,inserted
) = add_edge(vid
, a
, EdgeID(current_edge_id
++), g
);
391 if (! check_edge_added(g
, e
, vid
, a
, edge_id_map
, current_edge_id
- 1,
398 cerr
<< "add_edge(" << vertex_id_map
[b
] << "," << vertex_id_map
[vidp1
] <<")" << endl
;
400 // add_edge without plugin
401 boost::tie(e
,inserted
) = add_edge(b
, vidp1
, g
);
403 edge_id_map
[e
] = current_edge_id
;
406 if (! check_edge_added(g
, e
, b
, vidp1
, edge_id_map
,
407 current_edge_id
- 1, inserted
)) {
414 Vertex c
= random_vertex(g
, gen
);
416 cerr
<< "Testing clear vertex ..." << endl
; is_failed
= false;
417 print_graph(g
, vertex_id_map
);
418 // print_in_edges(g, vertex_id_map);
419 cerr
<< "clearing vertex " << vertex_id_map
[c
] << endl
;
423 print_graph(g
, vertex_id_map
);
424 // print_in_edges(g, vertex_id_map);
425 print_edges(g
, vertex_id_map
);
427 if (check_vertex_cleared(g
, c
, vertex_id_map
) && num_edges(g
) == count_edges(g
)) {
429 cerr
<< " Passed."<< endl
;
433 cerr
<< "**** Failed" << endl
;
440 cerr
<< "Testing remove vertex ..." << endl
; is_failed
= false;
441 cerr
<< "removing vertex " << vertex_id_map
[c
] << endl
;
444 old_N
= num_vertices(g
);
447 print_graph(g
,vertex_id_map
);
448 // print_in_edges(g,vertex_id_map);
449 print_edges(g
, vertex_id_map
);
451 // can't check in_vertex_set here because the vertex_descriptor c
452 // is no longer valid, we'll just make sure the vertex set has
455 graph_traits
<Graph
>::vertex_iterator v
, v_end
;
456 boost::tie(v
, v_end
) = vertices(g
);
457 for (N
= 0; v
!= v_end
; ++v
) ++N
; // N = std::distance(v, v_end);
458 if (N
!= old_N
- 1) {
461 cerr
<< " Failed. N = " << N
462 << " but should be " << old_N
- 1 << endl
;
468 if (N
!= old_N
- 1) {
471 cerr
<< " Failed. N = " << N
472 << " but should be " << old_N
- 1 << endl
;
476 cerr
<< " Passed."<< endl
;
481 std::cout
<< "tests passed" << std::endl
;