class OptimizerMediator(DeviceMediatorInterface):
	"""
	Mediator for Particle Swarm Optimizer. Majority of functionality arises from
	function calls unique to this mediator and not the normal common calls.
	""" 
	
	def __init__(self, dictionary):
		for (k, v) in dictionary.items():
			setattr(self, k, v)
		self.optimizer = ParticleSwarmOptimizer(self.paramBounds, 
												self.numOfParticles, 
												self.numOfGenerations, 
												self.fitnessEvalScript,
												self.phiG, 
												self.phiP,
												self.w,
												self.alpha,
												self.minimization)												
	def start(self):
		pass
		
	def stop(self):
		pass

	def save(self, pth):
		pass
		
	def processExpData(self, pth):
		pass

	def saveState(self, expPath):
		fPath = path.join(expPath, "OptimizerState.pkl")
		self.optimizer.saveState(fPath)

	def restoreState(self, expPath):
		fPath = path.join(expPath, "OptimizerState.pkl")
		if path.exists(fPath):
			self.optimizer.restoreState(fPath) 
	
# ----- Additional Functions	
	
	def getParticle(self):
		deapPart = self.optimizer.getParticle()
		if deapPart:
			part = deapPart[:]
		else:
			part = deapPart
		self.part = part
		partString = pickle.dumps(part)
		return partString
		
	def evaluateParticle(self, expPath, trialPath):
		self.optimizer.evaluateParticle(expPath, trialPath)
		self.saveState(expPath)
		self.saveState(trialPath)

	def getBestParticle(self):
		return self.optimizer.best
	def __init__(self, dictionary):
		for (k, v) in dictionary.items():
			setattr(self, k, v)
		self.optimizer = ParticleSwarmOptimizer(self.paramBounds, 
												self.numOfParticles, 
												self.numOfGenerations, 
												self.fitnessEvalScript,
												self.phiG, 
												self.phiP,
												self.w,
												self.alpha,
												self.minimization)