Source code for beagle.population

import random
from beagle import Individual
from scipy.constants import physical_constants
import numpy as np

k_b = physical_constants[ 'Boltzmann constant in eV/K' ][0]

[docs]class Population: def __init__( self, individuals=None ): if individuals: self.individuals = individuals else: self.individuals = [] def __getitem__( self, i ): return self.individuals[i] def __iter__( self ): return iter( self.individuals )
[docs] def fitness_scores( self, fitness_function ): return np.array( [ i.fitness_score( fitness_function ) for i in self.individuals ] )
@property def scores( self ): return np.array( [ i.score for i in self.individuals ] )
[docs] def sample( self, n=1 ): return random.sample( self.individuals, n )
def __add__( self, to_add ): if not isinstance( to_add, Individual ): raise TypeError self.individuals.append( to_add ) return self def __iadd__( self, to_add ): if not isinstance( to_add, Individual ): raise TypeError self.individuals.append( to_add ) return self def __len__( self ): return len( self.individuals )
[docs] def ranked( self, fitness_function ): return Population( individuals=sorted( self.individuals, key=lambda i: i.fitness_score( fitness_function ) ) )
[docs] def boltzmann( self, fitness_function, temp, size ): s = self.fitness_scores( fitness_function ) rel_p = np.exp( - ( s - s.min() ) / ( k_b * temp ) ) rel_p /= sum( rel_p ) return list( np.random.choice( self.individuals, size=size, p=rel_p, replace=False ) )
[docs] def sort( self ): self.individuals.sort()