]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/graph_parallel/test/distributed_queue_test.cpp
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / boost / libs / graph_parallel / test / distributed_queue_test.cpp
CommitLineData
7c673cae
FG
1// Copyright (C) 2004-2006 The Trustees of Indiana University.
2
3// Use, modification and distribution is subject to the Boost Software
4// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
5// http://www.boost.org/LICENSE_1_0.txt)
6
7// Authors: Douglas Gregor
8// Andrew Lumsdaine
9#include <boost/graph/use_mpi.hpp>
10#include <boost/config.hpp>
11#include <boost/throw_exception.hpp>
12#include <boost/serialization/vector.hpp>
13#include <boost/graph/distributed/queue.hpp>
1e59de90 14#include <boost/core/lightweight_test.hpp>
7c673cae
FG
15#include <boost/graph/distributed/mpi_process_group.hpp>
16#include <boost/pending/queue.hpp>
17#include <boost/property_map/property_map.hpp>
18#include <utility>
19#include <iostream>
20
21#ifdef BOOST_NO_EXCEPTIONS
22void
23boost::throw_exception(std::exception const& ex)
24{
25 std::cout << ex.what() << std::endl;
26 abort();
27}
28#endif
29
30using boost::graph::distributed::mpi_process_group;
31
32struct global_value
33{
34 global_value(int p = -1, std::size_t l = 0) : processor(p), value(l) {}
35
36 int processor;
37 std::size_t value;
38
39 template<typename Archiver>
40 void serialize(Archiver& ar, const unsigned int /*version*/)
41 {
42 ar & processor & value;
43 }
44};
45
46namespace boost { namespace mpi {
47 template<> struct is_mpi_datatype<global_value> : mpl::true_ { };
48} } // end namespace boost::mpi
49
50BOOST_IS_BITWISE_SERIALIZABLE(global_value)
51BOOST_CLASS_IMPLEMENTATION(global_value,object_serializable)
52BOOST_CLASS_TRACKING(global_value,track_never)
53
54inline bool operator==(const global_value& x, const global_value& y)
55{ return x.processor == y.processor && x.value == y.value; }
56
57struct global_value_owner_map
58{
59 typedef int value_type;
60 typedef value_type reference;
61 typedef global_value key_type;
62 typedef boost::readable_property_map_tag category;
63};
64
65int get(global_value_owner_map, global_value k)
66{
67 return k.processor;
68}
69
70void test_distributed_queue()
71{
72 mpi_process_group process_group;
73
74 typedef boost::queue<global_value> local_queue_type;
75
76 typedef boost::graph::distributed::distributed_queue<mpi_process_group,
77 global_value_owner_map,
78 local_queue_type> dist_queue_type;
79
80 dist_queue_type Q(process_group, global_value_owner_map());
81
82 mpi_process_group::process_id_type id = process_id(process_group),
83 n = num_processes(process_group);
84 global_value v(0, 0);
85
86 if (id == 0) {
87 std::cerr << "Should print level of each processor in a binary tree:\n";
88 }
89 synchronize(process_group);
90
91 if (id == n-1) Q.push(v);
92 while (!Q.empty()) {
93 v = Q.top(); Q.pop();
94
95 std::cerr << "#" << id << ": level = " << v.value << std::endl;
96
97 int level_begin = 1;
98 for (std::size_t i = 0; i < v.value; ++i) level_begin *= 2;
99 int level_end = level_begin * 2;
1e59de90
TL
100 BOOST_TEST(level_begin <= (id + 1));
101 BOOST_TEST((id + 1) <= level_end);
7c673cae
FG
102
103 ++v.value;
104 v.processor = v.processor * 2 + 1;
105 if (v.processor < n) Q.push(v);
106 ++v.processor;
107 if (v.processor < n) Q.push(v);
108 }
109}
110
1e59de90 111int main(int argc, char** argv)
7c673cae
FG
112{
113 boost::mpi::environment env(argc, argv);
114 test_distributed_queue();
1e59de90 115 return boost::report_errors();
7c673cae 116}