Source code for cosmoHammer.pso.MpiParticleSwarmOptimizer

'''
Created on Oct 28, 2013

@author: J.Akeret
'''
from __future__ import print_function, division, absolute_import, \
    unicode_literals
    
import multiprocessing
import numpy

from cosmoHammer.util.MpiUtil import MpiPool, mpiBCast
from cosmoHammer.pso.ParticleSwarmOptimizer import ParticleSwarmOptimizer



[docs]class MpiParticleSwarmOptimizer(ParticleSwarmOptimizer): """ PSO with support for MPI to distribute the workload over multiple nodes """ def __init__(self, func, low, high, particleCount=25, threads=1): self.threads = threads pool = MpiPool(self._getMapFunction()) super(MpiParticleSwarmOptimizer, self).__init__(func, low, high, particleCount=particleCount, pool=pool) def _getMapFunction(self): if self.threads > 1: pool = multiprocessing.Pool(self.threads) return pool.map else: return map def _converged(self, it, p, m, n): if(self.isMaster()): converged = super(MpiParticleSwarmOptimizer, self)._converged(it, p, m, n) else: converged = False converged = mpiBCast(converged) return converged def _get_fitness(self,swarm): mapFunction = self.pool.map mpiSwarm = mpiBCast(swarm) pos = numpy.array([part.position for part in mpiSwarm]) results = mapFunction(self.func, pos) lnprob = numpy.array([l[0] for l in results]) for i, particle in enumerate(swarm): particle.fitness = lnprob[i] particle.position = pos[i]
[docs] def isMaster(self): return self.pool.isMaster()