def biasedMixtures(self, role=None, strategy=None, bias=.9):
		"""
		Gives mixtures where the input strategy has %bias weight for its role.

		Probability for that role's remaining strategies is distributed
		uniformly, as is probability for all strategies of other roles.

		Returns a list even when a single role & strategy are specified, since
		the main use case is starting replicator dynamics from several mixtures.
		"""
		assert 0 <= bias <= 1, "probabilities must be between zero and one"
		if self.maxStrategies == 1:
			return [self.uniformMixture()]
		if role == None:
			return flatten([self.biasedMixtures(r, strategy, bias) for r \
					in filter(lambda r: self.numStrategies[self.index(r)] \
					> 1, self.roles)])
		if strategy == None:
			return flatten([self.biasedMixtures(role, s, bias) for s in \
					self.strategies[role]])
		i = self.array_index(role, strategy, dtype=float)
		m = 1. - self.mask - i
		m /= m.sum(1).reshape(m.shape[0], 1)
		m[self.index(role)] *= (1. - bias)
		m += i*bias
		return [m]
def is_mixed_profile(prof):
	if not isinstance(prof, h_dict):
		return False
	flat = flatten([v.values() for v in prof.values()])
	return all([prob >= 0 for prob in flat]) and \
			np.allclose(sum(flat), len(prof))
def is_pure_profile(prof):
	if not isinstance(prof, h_dict):
		return False
	flat = flatten([v.values() for v in prof.values()])
	return all([isinstance(count, int) and count >= 0 for count in flat])