def initialize_structures(self): global logger self.output.write('\n----Initialize Structures----\n') #self.logger.info('Initializing Structures') # Initialize Population - Generate a list of ncluster individuals # Set bulk and index atributes if self.restart: logger.info('Loading previous population') pop = generate.get_restart_population(self) else: logger.info('Generating new population') pop = generate.get_population(self) if 'MA' in self.debug: inp_out.write_xyz(self.debugfile,pop[0][0],'First Generated Individual') #Use if concentration of interstitials is unknown if self.swaplist: mutlist=self.mutation_options self.mutation_options=['IntSwapLocal'] for i in range(len(pop)): one = pop[i] one.swaplist=copy.deepcopy(swaplist) if random.random() < 0.25: pop[i], opt = switches.moves_switch(one,self) self.mutation_options=mutlist # Write Initial structures to files self.output.write('\n---Starting Structures---\n') inp_out.write_pop(self, pop) #Print number of atoms to Summary file if self.structure=='Defect' or self.structure=='Surface': natstart=len(pop[0][0])+len(pop[0].bulki) else: natstart=len(pop[0][0]) if not self.restart: if self.structure=='Defect': self.summary.write('Defect Run Pure Bulk Energy per Atom : '+repr(self.purebulkenpa)+'\n') else: self.summary.write(self.structure+' Run : '+repr(0)+'\n') self.summary.write('Natoms '+repr(natstart)+ '\n') #Print data headers to summary file self.summary.write('Generation Fitmin Fitavg Fitmedium Fitmax std time \n') offspring=pop #pop=[] #BESTS=[] return offspring
def check_pop(self, pop): # Gather all the energies/fitnesses if self.output_format=='totalenergy': complist = [ind.energy for ind in pop] elif self.output_format=='formation_energy': complist = [] for ind in pop: solid=Atoms() solid.extend(ind[0]) solid.extend(ind.bulki) energy=ind.energy for sym,c,m,u in self.atomlist: nc=len([atm for atm in solid if atm.symbol==sym]) energy-= float(nc)*float(u) complist.append(energy) elif self.output_format=='formation_energy_per_int': complist = [] for ind in pop: solid=Atoms() solid.extend(ind[0]) solid.extend(ind.bulki) energy=ind.energy for sym,c,m,u in self.atomlist: nc=len([atm for atm in solid if atm.symbol==sym]) energy-= float(nc)*float(u) energy=energy/self.natoms complist.append(energy) elif self.output_format=='formation_energy2': complist = [(ind.energy - ind.purebulkenpa*(ind[0].get_number_of_atoms()+ind.bulki.get_number_of_atoms()))/(ind[0].get_number_of_atoms()+ind.bulki.get_number_of_atoms()-ind.natomsbulk) for ind in pop] elif self.output_format=='energy_per_atom': complist = [ind.energy/(ind[0].get_number_of_atoms()+ind.bulki.get_number_of_atoms()) for ind in pop] else: complist = [ind.fitness for ind in pop] # Calcluate and print the Stats length = len(pop) mean = sum(complist) / length complist.sort() medium = complist[length/2] sum2 = sum(x*x for x in complist) std = abs(sum2 / length - mean**2)**0.5 mine = min(complist) maxe = max(complist) self.output.write('\n----Stats----\n') self.output.write(' Min '+repr(mine)+'\n') self.output.write(' Max '+repr(maxe)+'\n') self.output.write(' Avg '+repr(mean)+'\n') self.output.write(' Medium '+repr(medium)+'\n') self.output.write(' Std '+repr(std)+'\n') self.output.write(' Genrep '+repr(self.genrep)+'\n') self.summary.write('{Gen} {Fitmin} {Fitavg} {Fitmed} {Fitmax} {Std} {time}\n'.format( Gen=str(self.generation),Fitmin=repr(mine),Fitavg=repr(mean),Fitmed=repr(medium),Fitmax=repr(maxe), Std=repr(std),time=repr(time.asctime( time.localtime(time.time()) )))) # Set new index values and write population index1 = 0 for ind in pop: ind.index=index1 index1+=1 inp_out.write_pop(self,pop) if self.allenergyfile: for ind in pop: self.tenergyfile.write(repr(ind.energy)+' ') self.tenergyfile.write('\n') #Check Convergence of population based on fitness fitnesses = [ind.fitness for ind in pop] popmin = min(fitnesses) popmean = sum(fitnesses) / len(fitnesses) sum2 = sum(x*x for x in fitnesses) popstd = abs(sum2 / len(fitnesses) - popmean**2)**0.5 convergence = False if self.convergence_scheme=='gen_rep_min': if self.generation < self.maxgen: if self.generation == 0: self.minfit = popmin if abs(self.minfit - popmin) < self.tolerance: self.genrep += 1 else: self.genrep = 0 self.minfit = popmin if self.genrep > self.reqrep: self.convergence = True else: self.convergence = True elif self.convergence_scheme=='gen_rep_avg': if self.generation < self.maxgen: if self.generation == 0: self.minfit = popmean if abs(self.minfit - popmean) < self.tolerance: self.genrep += 1 else: self.genrep = 0 self.minfit = popmean if self.genrep > self.reqrep: self.convergence = True else: self.convergence = True elif self.convergence_scheme=='std': if popstd < self.tolerance: self.convergence = True else:#self.convergence_scheme=='max_gen': if self.generation > self.maxgen: self.convergence = True #Flush output to files self.output.flush() self.summary.flush() for ind in self.files: ind.flush() if self.indiv_defect_write: for ind in self.ifiles: ind.flush() if self.genealogy: self.Genealogyfile.flush() if self.allenergyfile: self.tenergyfile.flush() if 'MA' in self.debug: self.debugfile.flush() if self.fingerprinting: self.fpfile.flush() self.fpminfile.flush() return self