Source code for cosmoHammer.MpiCosmoHammerSampler


from cosmoHammer import CosmoHammerSampler

from cosmoHammer.util.SampleFileUtil import SampleFileUtil
from cosmoHammer.util.MpiUtil import MpiPool, mpiBCast

[docs]class MpiCosmoHammerSampler(CosmoHammerSampler): """ A sampler implementation extending the regular sampler in order to allow for distributing the computation with MPI. :param kwargs: key word arguments passed to the CosmoHammerSampler """ def __init__(self, **kwargs): """ CosmoHammer sampler implementation """ self.pool = MpiPool(self._getMapFunction()) self.rank = self.pool.rank super(MpiCosmoHammerSampler, self).__init__(pool=self.pool, **kwargs) def _getMapFunction(self): """ Returns the build in map function """ return map
[docs] def createSampleFileUtil(self): """ Returns a new instance of a File Util """
return SampleFileUtil(self.filePrefix, self.isMaster(), reuseBurnin=self.reuseBurnin)
[docs] def sampleBurnin(self, p0): """ Starts the sampling process. The master node (mpi rank = 0) persists the result to the disk """ p0 = mpiBCast(p0) self.log("MPI Process rank "+ str(self.rank)+" starts sampling")
return super(MpiCosmoHammerSampler, self).sampleBurnin(p0);
[docs] def sample(self, burninPos, burninProb, burninRstate, datas): """ Starts the sampling process. The master node (mpi rank = 0) persists the result to the disk """ burninPos = mpiBCast(burninPos) burninProb = mpiBCast(burninProb) burninRstate = mpiBCast(burninRstate) self.log("MPI Process rank "+ str(self.rank)+" starts sampling")
super(MpiCosmoHammerSampler, self).sample(burninPos, burninProb, burninRstate, datas);
[docs] def loadBurnin(self): """ loads the burn in form the file system """ if(self.isMaster()): pos, prob, rstate = super(MpiCosmoHammerSampler, self).loadBurnin() else: pos, prob, rstate = [] pos = mpiBCast(pos) prob = mpiBCast(prob) rstate = mpiBCast(rstate) self.log("loading done")
return pos, prob, rstate
[docs] def createInitPos(self): """ Factory method to create initial positions """ #bcast the positions to ensure that all mpi nodes start at the same position
return mpiBCast(super(MpiCosmoHammerSampler, self).createInitPos())
[docs] def isMaster(self): """ Returns true if the rank is 0 """
return self.pool.isMaster()