示例#1
0
 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
示例#2
0
 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
示例#3
0
 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
示例#4
0
 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
示例#5
0
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])],
            )