Example #1
0
 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
Example #2
0
 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