| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 | // Copyright Daniel Wallin 2007. 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)#ifndef BOOST_SHUFFLED_DISTRIBUTION_070923_HPP#define BOOST_SHUFFLED_DISTRIBUTION_070923_HPP#ifndef BOOST_GRAPH_USE_MPI#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"#endif# include <boost/assert.hpp># include <boost/iterator/counting_iterator.hpp># include <vector>namespace boost { namespace graph { namespace distributed {template <class BaseDistribution>struct shuffled_distribution : BaseDistribution{    typedef std::size_t size_type;    template <class ProcessGroup>    shuffled_distribution(ProcessGroup const& pg, BaseDistribution const& base)      : BaseDistribution(base)      , n(num_processes(pg))      , mapping_(make_counting_iterator(size_type(0)), make_counting_iterator(n))      , reverse_mapping(mapping_)    {}    std::vector<size_type> const& mapping() const    {        return mapping_;    }    template <class InputIterator>    void assign_mapping(InputIterator first, InputIterator last)    {        mapping_.assign(first, last);        BOOST_ASSERT(mapping_.size() == n);        reverse_mapping.resize(mapping_.size());        for (std::vector<size_t>::iterator i(mapping_.begin());            i != mapping_.end(); ++i)        {            reverse_mapping[*i] = i - mapping_.begin();        }    }    BaseDistribution& base()    {        return *this;    }    BaseDistribution const& base() const    {        return *this;    }    template <class ProcessID>    size_type block_size(ProcessID id, size_type n) const    {        return base().block_size(reverse_mapping[id], n);    }    template <class T>    size_type operator()(T const& value) const    {        return mapping_[base()(value)];    }    template <class ProcessID>    size_type start(ProcessID id) const    {        return base().start(reverse_mapping[id]);    }    size_type local(size_type i) const    {        return base().local(i);    }    size_type global(size_type i) const    {        return base().global(i);    }    template <class ProcessID>    size_type global(ProcessID id, size_type n) const    {        return base().global(reverse_mapping[id], n);    }    template <class Archive>    void serialize(Archive& ar, unsigned long /*version*/)    {        ar & serialization::make_nvp("base", base());    }    void clear()     {        base().clear();    }private:    size_type n;    std::vector<size_type> mapping_;    std::vector<size_type> reverse_mapping;};}}} // namespace boost::graph::distributed#endif // BOOST_SHUFFLED_DISTRIBUTION_070923_HPP
 |