adjlist_remove_test.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. // Copyright 2004 The Trustees of Indiana University.
  2. // Use, modification and distribution is subject to the Boost Software
  3. // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt)
  5. // Authors: Douglas Gregor
  6. // Andrew Lumsdaine
  7. #include <boost/graph/use_mpi.hpp>
  8. #include <boost/config.hpp>
  9. #include <boost/throw_exception.hpp>
  10. #include <boost/graph/distributed/adjacency_list.hpp>
  11. #include <boost/graph/distributed/mpi_process_group.hpp>
  12. #include <boost/graph/parallel/distribution.hpp>
  13. #include <iostream>
  14. #include <cassert>
  15. #include <boost/test/minimal.hpp>
  16. #ifdef BOOST_NO_EXCEPTIONS
  17. void
  18. boost::throw_exception(std::exception const& ex)
  19. {
  20. std::cout << ex.what() << std::endl;
  21. abort();
  22. }
  23. #endif
  24. using namespace boost;
  25. using boost::graph::distributed::mpi_process_group;
  26. void test_bidirectional_graph()
  27. {
  28. typedef adjacency_list<listS, distributedS<mpi_process_group, vecS>,
  29. bidirectionalS> Graph;
  30. typedef graph_traits<Graph>::vertex_descriptor Vertex;
  31. typedef std::pair<std::size_t, std::size_t> E;
  32. E edges[3] = { E(0,3), E(1,4), E(2,5) };
  33. Graph g(&edges[0], &edges[0] + 3, 6);
  34. assert(num_processes(g.process_group()) == 2);
  35. if (process_id(g.process_group()) == 0)
  36. std::cerr << "Testing bidirectional graph edge removal...";
  37. synchronize(g.process_group());
  38. graph_traits<Graph>::vertex_iterator vi = vertices(g).first;
  39. Vertex u = *vi++;
  40. Vertex v = *vi++;
  41. Vertex w = *vi++;
  42. BOOST_CHECK(vi == vertices(g).second);
  43. BOOST_CHECK((process_id(g.process_group()) == 0 && out_degree(u, g) == 1)
  44. || (process_id(g.process_group()) == 1 && in_degree(u, g) == 1));
  45. BOOST_CHECK((process_id(g.process_group()) == 0 && out_degree(v, g) == 1)
  46. || (process_id(g.process_group()) == 1 && in_degree(v, g) == 1));
  47. BOOST_CHECK((process_id(g.process_group()) == 0 && out_degree(w, g) == 1)
  48. || (process_id(g.process_group()) == 1 && in_degree(w, g) == 1));
  49. // Remove edges
  50. if (process_id(g.process_group()) == 0) {
  51. remove_edge(*out_edges(u, g).first, g);
  52. remove_edge(*out_edges(w, g).first, g);
  53. } else {
  54. remove_edge(*in_edges(v, g).first, g);
  55. remove_edge(*in_edges(w, g).first, g);
  56. }
  57. synchronize(g);
  58. BOOST_CHECK(num_edges(g) == 0);
  59. BOOST_CHECK(out_degree(u, g) == 0);
  60. BOOST_CHECK(out_degree(v, g) == 0);
  61. BOOST_CHECK(out_degree(w, g) == 0);
  62. BOOST_CHECK(in_degree(u, g) == 0);
  63. BOOST_CHECK(in_degree(v, g) == 0);
  64. BOOST_CHECK(in_degree(w, g) == 0);
  65. if (process_id(g.process_group()) == 0) std::cerr << "OK.\n";
  66. }
  67. void test_undirected_graph()
  68. {
  69. typedef adjacency_list<listS, distributedS<mpi_process_group, vecS>,
  70. undirectedS> Graph;
  71. typedef graph_traits<Graph>::vertex_descriptor Vertex;
  72. typedef graph_traits<Graph>::edge_descriptor Edge;
  73. typedef std::pair<std::size_t, std::size_t> E;
  74. E the_edges[3] = { E(0,3), E(1,4), E(2,5) };
  75. Graph g(&the_edges[0], &the_edges[0] + 3, 6);
  76. assert(num_processes(g.process_group()) == 2);
  77. if (process_id(g.process_group()) == 0)
  78. std::cerr << "Testing undirected graph edge removal...";
  79. synchronize(g.process_group());
  80. graph_traits<Graph>::vertex_iterator vi = vertices(g).first;
  81. Vertex u = *vi++;
  82. Vertex v = *vi++;
  83. Vertex w = *vi++;
  84. BOOST_CHECK(vi == vertices(g).second);
  85. BOOST_CHECK(degree(u, g) == 1);
  86. BOOST_CHECK(degree(v, g) == 1);
  87. BOOST_CHECK(degree(w, g) == 1);
  88. // Remove edges
  89. if (process_id(g.process_group()) == 0) {
  90. BOOST_CHECK(num_edges(g) == 3);
  91. remove_edge(*out_edges(u, g).first, g);
  92. remove_edge(*out_edges(w, g).first, g);
  93. } else {
  94. BOOST_CHECK(num_edges(g) == 0);
  95. remove_edge(*in_edges(v, g).first, g);
  96. remove_edge(*in_edges(w, g).first, g);
  97. }
  98. synchronize(g);
  99. if (num_edges(g) > 0) {
  100. Edge e = *edges(g).first;
  101. std::cerr << "#" << process_id(g.process_group()) << ": extra edge! ("
  102. << local(source(e, g)) << "@" << owner(source(e, g))
  103. << ", "
  104. << local(target(e, g)) << "@" << owner(target(e, g))
  105. << ")\n";
  106. }
  107. BOOST_CHECK(num_edges(g) == 0);
  108. BOOST_CHECK(degree(u, g) == 0);
  109. BOOST_CHECK(degree(v, g) == 0);
  110. BOOST_CHECK(degree(w, g) == 0);
  111. if (process_id(g.process_group()) == 0) std::cerr << "OK.\n";
  112. }
  113. int test_main(int argc, char** argv)
  114. {
  115. boost::mpi::environment env(argc, argv);
  116. test_bidirectional_graph();
  117. test_undirected_graph();
  118. return 0;
  119. }