def gen_offspring_box(self, mutRate=0.3, xyzLims=[], bondRejList = None, constrainTop=False, rattleOn=True, growOn=True, leachOn=True, permuteOn = True, transOn = True, transVec=[[-2,2],[-2,2]]): kid, parent = None, None mater, pater = 0, 0 while kid is None: mater, pater = self.choose_parents() a1 = self.gadb.get(id=mater).toatoms() a2 = self.gadb.get(id=pater).toatoms() surf1 = Interface(a1, self.substrate, zLim=self.zLim) surf2 = Interface(a2, self.substrate, zLim=self.zLim) kid = crossover_snsSurf_2d_GC(surf1, surf2, tolerance=0.75) parent = surf1.copy() print('PARENTS: %i and %i'%(mater, pater)) myMutate = '' if srtDist_similar_zz(a1, a2)\ or srtDist_similar_zz(a1, kid.get_allAtoms())\ or srtDist_similar_zz(a2, kid.get_allAtoms()): print(' |- TOO SIMILAR!') mutRate = 1 if np.random.rand() < mutRate: mutType = np.random.choice([0,1,2,3,4], size=1)[0] if mutType == 0 and rattleOn: myMutate = 'rattle' kid.rattleMut() if mutType == 1 and growOn: myMutate = 'grow' kid.growMut_box([l for l in self.chemPotDict], xyzLims=xyzLims, bondRejList=bondRejList, constrainTop=constrainTop) if mutType == 2 and leachOn: myMutate = 'leach' kid.leachMut([l for l in self.chemPotDict]) if mutType == 3 and permuteOn: myMutate = 'permute' kid.permuteMut() if mutType == 4 and transOn: myMutate = 'translate' kid.transMut(transVec=transVec) if len(kid.get_adsList()) <= 1: myMutate = 'init' print(' |- Bare substrate, BAD!') kid = parent.copy() kid.rattleMut() kid.growMut([l for l in self.chemPotDict]) open('label', 'w').write('%i %i %s'%(mater, pater, myMutate)) self.gadb.update(mater, mated=self.gadb.get(id=mater).mated+1) self.gadb.update(pater, mated=self.gadb.get(id=pater).mated+1) return kid
def is_uniqueInPop(self, atoms): ''' Check similarity against the current population ''' aliveList = self.get_ID('alive=1') aliveList = [self.gadb.get(id=n).toatoms() for n in aliveList] isUnique = True for a in aliveList: if srtDist_similar_zz(atoms, a): isUnique = False break return isUnique
def gen_offspring(self, mutRate=0.4): kid = None mater, pater = 0, 0 while kid is None: mater, pater = self.choose_parents() a1 = self.gadb.get(id=mater).toatoms() a2 = self.gadb.get(id=pater).toatoms() surf1 = Interface(a1, self.substrate, zLim=self.zLim) surf2 = Interface(a2, self.substrate, zLim=self.zLim) kid = crossover_snsSurf_2d(surf1, surf2, tolerance=0.75) print('PARENTS: %i and %i' % (mater, pater)) if srtDist_similar_zz(a1, a2)\ or srtDist_similar_zz(a1, kid.get_allAtoms())\ or srtDist_similar_zz(a2, kid.get_allAtoms()): print(' |- TOO SIMILAR!') mutRate = 1 if np.random.rand() < mutRate: print(' |- MUTATION!') kid.transMut() kid.rattleMut() self.gadb.update(mater, mated=self.gadb.get(id=mater).mated + 1) self.gadb.update(pater, mated=self.gadb.get(id=pater).mated + 1) return kid
def is_uniqueInPop(self, atoms, grandPot): ''' Check similarity against the current population ''' eneCut = 0.05 aliveList = self.get_ID('alive=1') grandPotList = self.get_valueOf('grandPot', aliveList) isUnique = True for ii in range(len(aliveList)): a = self.gadb.get(id=aliveList[ii]).toatoms() if srtDist_similar_zz(atoms, a): if -eneCut < grandPotList[ii] - grandPot < eneCut: isUnique = False break return isUnique
def clusterIsomerAbs( trajAtoms, # Must containg energy information eneToler=0.05, geomToler1=5e-4, geomToler2=0.5, outName='sort'): import gocia.ensemble.comparator as comp # Handle the bad or other-format outputs if 'mag' in trajAtoms[0].info.keys(): magArray = [a.info['mag'] for a in trajAtoms] else: magArray = [0] * len(trajAtoms) if 'eV' in trajAtoms[0].info.keys(): eneArray = [a.info['eV'] for a in trajAtoms] else: eneArray = [a.get_potential_energy() for a in trajAtoms] print(' * Detecting unique isomers...') nStates = len(trajAtoms) isomerLabel = [-1] * nStates currIso, currInd = [], 0 while -1 in isomerLabel: if currInd >= nStates: break if isomerLabel[currInd] != -1: currInd += 1 continue print(' |-Isomer %i' % len(list(set(isomerLabel))), end='\t:') for i in range(nStates): if isomerLabel[i] != -1: continue # if simMat[currInd][i] == 1: # isomerLabel[i] = currInd if abs(eneArray[i] - eneArray[currInd]) < eneToler and\ comp.srtDist_similar_zz(trajAtoms[i],trajAtoms[currInd],\ delta_rel=geomToler1, d_max=geomToler2): isomerLabel[i] = currInd print(i, end=',') currInd += 1 print('') isoUniq = set(isomerLabel) eneUniq = [eneArray[i] for i in isoUniq] magUniq = [magArray[i] for i in isoUniq] countUniq = [isomerLabel.count(i) for i in isoUniq] # print(countUniq) print('-' * 76) print(' %i\tisomers found from %s\tsamples. Oversampling = %s'%\ (len(isoUniq), nStates, '{:.2%}'.format(nStates/len(isoUniq)-1))) sortedTraj = [] for v in sorted(eneUniq): sortedTraj.append(trajAtoms[list(eneArray).index(v)]) with connect('%s.db' % outName, append=False) as srtDB: for i in range(len(sortedTraj)): srtDB.write( sortedTraj[i], done=1, eV=sorted(eneUniq)[i], eV2GM=sorted(eneUniq)[i] - min(eneUniq), mag=magUniq[eneUniq.index(sorted(eneUniq)[i])], counts=countUniq[eneUniq.index(sorted(eneUniq)[i])], )