7 std::function<bool()>
random_updater(
const sopt::mpi::Communicator& comm,
const t_int total,
8 const t_int update_size,
9 const std::shared_ptr<bool> update_pointer,
10 const std::string& update_name) {
11 if (update_size > comm.size())
12 throw std::runtime_error(
13 "Number of random updates cannot be greater than number of MPI processors in the "
15 std::to_string(comm.size()) +
" < " + std::to_string(update_size) +
" .");
16 std::shared_ptr<std::vector<t_int>> ind = std::make_shared<std::vector<t_int>>(total, 0);
17 for (t_int i = 0; i < total; i++) (*ind)[i] = i;
18 std::random_device rng;
19 std::shared_ptr<std::mt19937> urng = std::make_shared<std::mt19937>(rng());
20 return [update_pointer, update_size, update_name, ind, comm, urng]() ->
bool {
22 std::shuffle(std::begin(*ind), std::end(*ind), *urng);
24 *ind = comm.broadcast(*ind);
25 *update_pointer =
false;
26 for (t_int i = 0; i < update_size; i++)
27 if (comm.rank() == ind->at(i)) {
28 SOPT_DEBUG(
"Process {} doing {}", comm.rank(), update_name);
29 *update_pointer =
true;
31 return *update_pointer;
std::function< bool()> random_updater(const sopt::mpi::Communicator &comm, const t_int total, const t_int update_size, const std::shared_ptr< bool > update_pointer, const std::string &update_name)