]>
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>
37 BOOST_INSTALL_PROPERTY(vertex
, id
);
38 BOOST_INSTALL_PROPERTY(edge
, id
);
41 #include "graph_type.hpp" // this provides a typedef for Graph
43 using namespace boost
;
46 This program tests models of the MutableGraph concept.
54 template < class Graph
, class Vertex
, class ID
>
55 bool check_vertex_cleared(Graph
& g
, Vertex v
, ID id
)
57 typename graph_traits
< Graph
>::vertex_iterator vi
, viend
;
58 for (boost::tie(vi
, viend
) = vertices(g
); vi
!= viend
; ++vi
)
60 typename graph_traits
< Graph
>::adjacency_iterator ai
, aiend
, found
;
61 boost::tie(ai
, aiend
) = adjacent_vertices(*vi
, g
);
62 boost::indirect_cmp
< ID
, std::equal_to
< std::size_t > > cmp(id
);
64 #if (defined(BOOST_MSVC) && BOOST_MSVC <= 1300) && defined(__SGI_STL_PORT)
65 // seeing internal compiler errors when using std::find_if()
67 for (; ai
!= aiend
; ++ai
)
73 #elif defined(BOOST_NO_CXX98_BINDERS)
75 = std::find_if(ai
, aiend
, std::bind(cmp
, v
, std::placeholders::_1
));
77 found
= std::find_if(ai
, aiend
, std::bind1st(cmp
, v
));
83 std::cerr
<< "should not have found vertex " << id
[*found
]
92 template < class Graph
, class Edge
, class EdgeID
>
93 bool check_edge_added(Graph
& g
, Edge e
,
94 typename graph_traits
< Graph
>::vertex_descriptor a
,
95 typename graph_traits
< Graph
>::vertex_descriptor b
, EdgeID edge_id
,
96 std::size_t correct_id
, bool inserted
)
98 if (!(source(e
, g
) == a
))
101 cerr
<< " Failed, vertex a not source of e." << endl
;
105 else if (!(target(e
, g
) == b
))
108 cerr
<< " Failed, vertex b not source of e." << endl
;
112 else if (!is_adjacent(g
, a
, b
))
115 cerr
<< " Failed, not adj." << endl
;
119 else if (!in_edge_set(g
, e
))
122 cerr
<< " Failed, not in edge set." << endl
;
126 else if (inserted
&& edge_id
[e
] != correct_id
)
129 cerr
<< " Failed, invalid edge property." << endl
;
133 else if (!inserted
&& edge_id
[e
] != edge_id
[edge(a
, b
, g
).first
])
136 cerr
<< " Failed, invalid edge property." << endl
;
140 else if (num_edges(g
) != count_edges(g
))
143 cerr
<< " Failed, invalid number of edges." << endl
;
150 template < class Graph
> std::size_t count_edges(Graph
& g
)
153 typename
boost::graph_traits
< Graph
>::edge_iterator ei
, ei_end
;
154 for (boost::tie(ei
, ei_end
) = edges(g
); ei
!= ei_end
; ++ei
)
159 int main(int, char*[])
162 std::size_t N
= 5, E
= 0;
165 typedef ::Graph Graph
;
167 typedef boost::graph_traits
< Graph
>::vertex_descriptor Vertex
;
168 typedef boost::graph_traits
< Graph
>::edge_descriptor Edge
;
171 std::size_t current_vertex_id
= 0;
172 std::size_t current_edge_id
= 0;
174 bool is_failed
= false;
176 property_map
< Graph
, vertex_id_t
>::type vertex_id_map
= get(vertex_id
, g
);
178 property_map
< Graph
, edge_id_t
>::type edge_id_map
= get(edge_id
, g
);
180 for (std::size_t k
= 0; k
< N
; ++k
)
181 add_vertex(current_vertex_id
++, g
);
183 // also need to test EdgeIterator graph constructor -JGS
186 for (j
= 0; j
< 10; ++j
)
191 cerr
<< "Testing add_edge ..." << endl
;
193 for (i
= 0; i
< 6; ++i
)
196 a
= random_vertex(g
, gen
);
199 b
= random_vertex(g
, gen
);
200 } while (a
== b
); // don't do self edges
202 cerr
<< "add_edge(" << vertex_id_map
[a
] << "," << vertex_id_map
[b
]
207 boost::tie(e
, inserted
) = add_edge(a
, b
, current_edge_id
++, g
);
209 std::cout
<< "inserted: " << inserted
<< std::endl
;
210 std::cout
<< "source(e,g)" << source(e
, g
) << endl
;
211 std::cout
<< "target(e,g)" << target(e
, g
) << endl
;
212 std::cout
<< "edge_id[e] = " << edge_id_map
[e
] << std::endl
;
213 print_edges2(g
, vertex_id_map
, edge_id_map
);
214 print_graph(g
, vertex_id_map
);
215 std::cout
<< "finished printing" << std::endl
;
216 // print_in_edges(g, vertex_id_map);
218 if (!check_edge_added(
219 g
, e
, a
, b
, edge_id_map
, current_edge_id
- 1, inserted
))
227 // remove_edge(u, v, g)
229 cerr
<< "Testing remove_edge(u, v, g) ..." << endl
;
232 for (i
= 0; i
< 2; ++i
)
235 print_edges(g
, vertex_id_map
);
239 Edge e
= random_edge(g
, gen
);
240 boost::tie(a
, b
) = boost::incident(e
, g
);
243 cerr
<< "remove_edge(" << vertex_id_map
[a
] << ","
244 << vertex_id_map
[b
] << ")" << endl
;
246 remove_edge(a
, b
, g
);
248 print_graph(g
, vertex_id_map
);
249 // print_in_edges(g, vertex_id_map);
250 print_edges(g
, vertex_id_map
);
252 is_failed
= is_failed
|| is_adjacent(g
, a
, b
)
253 || in_edge_set(g
, a
, b
) || num_edges(g
) != count_edges(g
);
261 cerr
<< " Failed." << endl
;
267 cerr
<< " Passed." << endl
;
273 cerr
<< "Testing remove_edge(e, g) ..." << endl
;
276 for (i
= 0; i
< 2; ++i
)
279 print_edges(g
, vertex_id_map
);
282 Edge e
= random_edge(g
, gen
);
283 boost::tie(a
, b
) = boost::incident(e
, g
);
286 cerr
<< "remove_edge(" << vertex_id_map
[a
] << ","
287 << vertex_id_map
[b
] << ")" << endl
;
289 graph_traits
< Graph
>::edges_size_type old_E
= num_edges(g
);
293 print_graph(g
, vertex_id_map
);
294 // print_in_edges(g, vertex_id_map);
295 print_edges(g
, vertex_id_map
);
298 is_failed
= is_failed
|| old_E
!= num_edges(g
) + 1
299 || num_edges(g
) != count_edges(g
);
307 cerr
<< " Failed." << endl
;
313 cerr
<< " Passed." << endl
;
319 cerr
<< "Testing add_vertex ..." << endl
;
322 old_N
= num_vertices(g
);
323 graph_traits
< Graph
>::vertex_descriptor vid
= add_vertex(g
),
324 vidp1
= add_vertex(g
);
325 vertex_id_map
[vid
] = current_vertex_id
++;
326 vertex_id_map
[vidp1
] = current_vertex_id
++;
329 print_vertices(g
, vertex_id_map
);
330 print_graph(g
, vertex_id_map
);
331 // print_in_edges(g,vertex_id_map);
332 print_edges(g
, vertex_id_map
);
334 // make sure the two added vertices are in the graph's vertex set
336 if (!in_vertex_set(g
, vid
))
339 cerr
<< " Failed, " << vertex_id_map
[vid
]
340 << " not in vertices(g)" << endl
;
345 if (!in_vertex_set(g
, vidp1
))
348 cerr
<< " Failed, " << vertex_id_map
[vidp1
]
349 << " not in vertices(g)" << endl
;
356 // make sure the vertices do not have any out edges yet
358 graph_traits
< Graph
>::out_edge_iterator e
, e_end
;
359 boost::tie(e
, e_end
) = out_edges(vid
, g
);
363 cerr
<< " Failed, " << vertex_id_map
[vid
]
364 << " should not have any out-edges yet" << endl
;
369 boost::tie(e
, e_end
) = out_edges(vidp1
, g
);
373 cerr
<< " Failed, " << vertex_id_map
[vidp1
]
374 << " should not have any out-edges yet" << endl
;
381 // make sure the vertices do not yet appear in any of the edges
383 graph_traits
< Graph
>::edge_iterator e
, e_end
;
384 for (boost::tie(e
, e_end
) = edges(g
); e
!= e_end
; ++e
)
386 if (source(*e
, g
) == vid
|| target(*e
, g
) == vid
)
389 cerr
<< " Failed, " << vertex_id_map
[vid
]
390 << " should not have any edges" << endl
;
395 if (source(*e
, g
) == vidp1
|| target(*e
, g
) == vidp1
)
398 cerr
<< " Failed, " << vertex_id_map
[vidp1
]
399 << " should not have any edges" << endl
;
406 // Make sure num_vertices(g) has been updated
408 if ((N
- 2) != old_N
)
412 cerr
<< " Failed. N = " << N
<< " but should be " << old_N
+ 2
420 cerr
<< " Passed." << endl
;
425 cerr
<< "Testing add_edge after add_vertex ..." << endl
;
429 for (i
= 0; i
< 2; ++i
)
431 Vertex a
= random_vertex(g
, gen
), b
= random_vertex(g
, gen
);
433 a
= random_vertex(g
, gen
);
435 b
= random_vertex(g
, gen
);
439 cerr
<< "add_edge(" << vertex_id_map
[vid
] << "," << vertex_id_map
[a
]
442 boost::tie(e
, inserted
)
443 = add_edge(vid
, a
, EdgeID(current_edge_id
++), g
);
445 if (!check_edge_added(
446 g
, e
, vid
, a
, edge_id_map
, current_edge_id
- 1, inserted
))
453 cerr
<< "add_edge(" << vertex_id_map
[b
] << ","
454 << vertex_id_map
[vidp1
] << ")" << endl
;
456 // add_edge without plugin
457 boost::tie(e
, inserted
) = add_edge(b
, vidp1
, g
);
459 edge_id_map
[e
] = current_edge_id
;
462 if (!check_edge_added(
463 g
, e
, b
, vidp1
, edge_id_map
, current_edge_id
- 1, inserted
))
471 Vertex c
= random_vertex(g
, gen
);
473 cerr
<< "Testing clear vertex ..." << endl
;
475 print_graph(g
, vertex_id_map
);
476 // print_in_edges(g, vertex_id_map);
477 cerr
<< "clearing vertex " << vertex_id_map
[c
] << endl
;
481 print_graph(g
, vertex_id_map
);
482 // print_in_edges(g, vertex_id_map);
483 print_edges(g
, vertex_id_map
);
485 if (check_vertex_cleared(g
, c
, vertex_id_map
)
486 && num_edges(g
) == count_edges(g
))
489 cerr
<< " Passed." << endl
;
495 cerr
<< "**** Failed" << endl
;
502 cerr
<< "Testing remove vertex ..." << endl
;
504 cerr
<< "removing vertex " << vertex_id_map
[c
] << endl
;
507 old_N
= num_vertices(g
);
510 print_graph(g
, vertex_id_map
);
511 // print_in_edges(g,vertex_id_map);
512 print_edges(g
, vertex_id_map
);
514 // can't check in_vertex_set here because the vertex_descriptor c
515 // is no longer valid, we'll just make sure the vertex set has
518 graph_traits
< Graph
>::vertex_iterator v
, v_end
;
519 boost::tie(v
, v_end
) = vertices(g
);
520 for (N
= 0; v
!= v_end
; ++v
)
521 ++N
; // N = std::distance(v, v_end);
526 cerr
<< " Failed. N = " << N
<< " but should be "
527 << old_N
- 1 << endl
;
537 cerr
<< " Failed. N = " << N
<< " but should be " << old_N
- 1
544 cerr
<< " Passed." << endl
;
549 std::cout
<< "tests passed" << std::endl
;