Source code for lib.Qmpi_tools
import numpy as np
[docs]
def join_toward_rank(comm, data, target_rank):
gathered_data = comm.gather(data, root=target_rank)
if comm.Get_rank() == target_rank:
return np.concatenate(gathered_data)
else:
return
[docs]
class MpiTools:
def __init__(self, comm):
self.comm = comm
def _print_message(self, message):
if self.comm is not None:
if self.comm.Get_rank() == 0:
print(message)
self.comm.Barrier()
def _barrier(self):
"""
Method to introduce comm._Barrier() function if MPI communicator is detected.
"""
if self.comm is None:
pass
else:
self.comm.Barrier()
[docs]
def get_random_value(self, init_seed=None):
"""Random value
Method to build a random seed.
Returns
-------
seed: int
Random seed.
"""
np.random.seed(init_seed)
if self.comm.Get_rank() == 0:
seed = np.random.randint(10000000)
else:
seed = None
seed = self.comm.bcast(seed, root=0)
return seed
[docs]
def bcast(self, arr):
if self.comm.Get_rank() == 0:
d = arr.copy()
else:
d = None
d = self.comm.bcast(d, root=0)
return d
[docs]
def join_data(comm, data):
if comm is None:
pass
else:
data = comm.gather(data, root=0)
if comm.Get_rank() == 0:
data = np.concatenate(data)
data = comm.bcast(data)
return data
[docs]
def split_data(comm, theta):
if comm is None:
return theta
else:
return np.array_split(theta, comm.Get_size())[comm.Get_rank()]