text: // Copyright (C) 2006 The Trustees of Indiana University.
  
  // Use, modification and distribution is subject to the Boost Software
  // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  // http://www.boost.org/LICENSE_1_0.txt)
  
  //  Authors: Douglas Gregor
  //           Andrew Lumsdaine
  
  // A test of the distributed compressed sparse row graph type
  #include <boost/graph/use_mpi.hpp>
  #include <boost/config.hpp>
  #include <boost/throw_exception.hpp>
  #include <boost/graph/distributed/compressed_sparse_row_graph.hpp>
  #include <boost/graph/distributed/mpi_process_group.hpp>
  #include <boost/graph/distributed/concepts.hpp>
  #include <boost/graph/erdos_renyi_generator.hpp>
  #include <boost/random/linear_congruential.hpp>
  #include <boost/graph/breadth_first_search.hpp>
  #include <boost/graph/graphviz.hpp>
  #include <boost/property_map/vector_property_map.hpp>
  #include <boost/test/minimal.hpp>
  
  #ifdef BOOST_NO_EXCEPTIONS
  void
  boost::throw_exception(std::exception const& ex)
  {
      std::cout << ex.what() << std::endl;
      abort();
  }
  #endif
  
  using namespace boost;
  using boost::graph::distributed::mpi_process_group;
  
  void concept_checks()
  {
    typedef compressed_sparse_row_graph<directedS, void, void, no_property, 
                                        distributedS<mpi_process_group> >
      Digraph;
    typedef graph_traits<Digraph>::vertex_descriptor vertex_descriptor;
    typedef graph_traits<Digraph>::edge_descriptor edge_descriptor;
  
    function_requires< GraphConcept<Digraph> >();
    function_requires< IncidenceGraphConcept<Digraph> >();
    function_requires< AdjacencyGraphConcept<Digraph> >();
  
    function_requires< DistributedVertexListGraphConcept<Digraph> >();
    function_requires< DistributedEdgeListGraphConcept<Digraph> >();
  
    function_requires<
      ReadablePropertyGraphConcept<Digraph, vertex_descriptor, vertex_global_t> 
      >();
    function_requires<
      ReadablePropertyGraphConcept<Digraph, vertex_descriptor, vertex_owner_t>
      >();
    function_requires<
      ReadablePropertyGraphConcept<Digraph, vertex_descriptor, vertex_local_t>
      >();
    function_requires<
      ReadablePropertyGraphConcept<Digraph, vertex_descriptor, vertex_index_t>
      >();
  
    function_requires<
      ReadablePropertyGraphConcept<Digraph, edge_descriptor, edge_global_t>
      >();
  
    // DPG TBD: edge_owner, edge_local property maps
  
    function_requires<
      ReadablePropertyGraphConcept<Digraph, edge_descriptor, edge_index_t>
      >();
  
    // Check default construction
    Digraph g;
  }
  
  int test_main(int argc, char* argv[])
  {
    mpi::environment env(argc, argv);
  
    concept_checks();
  
    typedef compressed_sparse_row_graph<directedS, void, void, no_property, 
                                        distributedS<mpi_process_group> >
      Digraph;
  
    // Build an Erdos-Renyi graph to test with
    typedef sorted_erdos_renyi_iterator<minstd_rand, Digraph> ERIter;
  
    int n = 40;
    double prob = 0.1;
  
    minstd_rand gen;
    Digraph g(ERIter(gen, n, prob), ERIter(), n);
  
    breadth_first_search(g, vertex(0, g), visitor(bfs_visitor<>()));
  
    std::ofstream out("dcsr.dot");
    write_graphviz(out, g);
    return 0;
  }
  