Chris@16: // Copyright Daniel Wallin 2007. Use, modification and distribution is Chris@16: // subject to the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_SHUFFLED_DISTRIBUTION_070923_HPP Chris@16: #define BOOST_SHUFFLED_DISTRIBUTION_070923_HPP Chris@16: Chris@16: #ifndef BOOST_GRAPH_USE_MPI Chris@16: #error "Parallel BGL files should not be included unless has been included" Chris@16: #endif Chris@16: Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: Chris@16: namespace boost { namespace graph { namespace distributed { Chris@16: Chris@16: template Chris@16: struct shuffled_distribution : BaseDistribution Chris@16: { Chris@16: typedef std::size_t size_type; Chris@16: Chris@16: template Chris@16: shuffled_distribution(ProcessGroup const& pg, BaseDistribution const& base) Chris@16: : BaseDistribution(base) Chris@16: , n(num_processes(pg)) Chris@16: , mapping_(make_counting_iterator(size_type(0)), make_counting_iterator(n)) Chris@16: , reverse_mapping(mapping_) Chris@16: {} Chris@16: Chris@16: std::vector const& mapping() const Chris@16: { Chris@16: return mapping_; Chris@16: } Chris@16: Chris@16: template Chris@16: void assign_mapping(InputIterator first, InputIterator last) Chris@16: { Chris@16: mapping_.assign(first, last); Chris@16: BOOST_ASSERT(mapping_.size() == n); Chris@16: reverse_mapping.resize(mapping_.size()); Chris@16: Chris@16: for (std::vector::iterator i(mapping_.begin()); Chris@16: i != mapping_.end(); ++i) Chris@16: { Chris@16: reverse_mapping[*i] = i - mapping_.begin(); Chris@16: } Chris@16: } Chris@16: Chris@16: BaseDistribution& base() Chris@16: { Chris@16: return *this; Chris@16: } Chris@16: Chris@16: BaseDistribution const& base() const Chris@16: { Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@16: size_type block_size(ProcessID id, size_type n) const Chris@16: { Chris@16: return base().block_size(reverse_mapping[id], n); Chris@16: } Chris@16: Chris@16: template Chris@16: size_type operator()(T const& value) const Chris@16: { Chris@16: return mapping_[base()(value)]; Chris@16: } Chris@16: Chris@16: template Chris@16: size_type start(ProcessID id) const Chris@16: { Chris@16: return base().start(reverse_mapping[id]); Chris@16: } Chris@16: Chris@16: size_type local(size_type i) const Chris@16: { Chris@16: return base().local(i); Chris@16: } Chris@16: Chris@16: size_type global(size_type i) const Chris@16: { Chris@16: return base().global(i); Chris@16: } Chris@16: Chris@16: template Chris@16: size_type global(ProcessID id, size_type n) const Chris@16: { Chris@16: return base().global(reverse_mapping[id], n); Chris@16: } Chris@16: Chris@16: template Chris@16: void serialize(Archive& ar, unsigned long /*version*/) Chris@16: { Chris@16: ar & serialization::make_nvp("base", base()); Chris@16: } Chris@16: Chris@16: void clear() Chris@16: { Chris@16: base().clear(); Chris@16: } Chris@16: Chris@16: private: Chris@16: size_type n; Chris@16: std::vector mapping_; Chris@16: std::vector reverse_mapping; Chris@16: }; Chris@16: Chris@16: }}} // namespace boost::graph::distributed Chris@16: Chris@16: #endif // BOOST_SHUFFLED_DISTRIBUTION_070923_HPP Chris@16: