Example #1
0
 def integrate_data(self, quantity, *domains, **kwargs):
     return_list = False
     if 'domains' in kwargs:
         domains = kwargs['domains']
         return_list = True
     #end if
     if 'return_list' in kwargs:
         return_list = kwargs['return_list']
     #end if
     if quantity not in SpaceGridBase.quantities:
         msg = 'requested integration of quantity ' + quantity + '\n'
         msg += '  ' + quantity + ' is not a valid SpaceGrid quantity\n'
         msg += '  valid quantities are:\n'
         msg += '  ' + str(SpaceGridBase.quantities)
         self.error(msg)
     #end if
     q = self.data[quantity]
     results = list()
     nblocks = q.shape[-1]
     qi = zeros((nblocks, ))
     if len(domains) == 0:
         for b in xrange(nblocks):
             qi[b] = q[..., b].sum()
         #end for
         (mean, var, error, kappa) = simstats(qi)
     else:
         for domain in domains:
             for b in xrange(nblocks):
                 qb = q[..., b]
                 qi[b] = qb[domain].sum()
             #end for
             (mean, var, error, kappa) = simstats(qi)
             res = QAobject()
             res.mean = mean
             res.error = error
             res.data = qi.copy()
             results.append(res)
         #end for
     #end for
     if len(domains) < 2:
         return mean, error
     else:
         if not return_list:
             return tuple(results)
         else:
             means = list()
             errors = list()
             for res in results:
                 means.append(res.mean)
                 errors.append(res.error)
             #end for
             return means, errors
Example #2
0
 def integrate_data(self,quantity,*domains,**kwargs):
     return_list = False
     if 'domains' in kwargs:
         domains = kwargs['domains']
         return_list = True
     #end if
     if 'return_list' in kwargs:
         return_list = kwargs['return_list']
     #end if
     if quantity not in SpaceGridBase.quantities:
         msg = 'requested integration of quantity '+quantity+'\n'
         msg +='  '+quantity+' is not a valid SpaceGrid quantity\n'
         msg +='  valid quantities are:\n'
         msg +='  '+str(SpaceGridBase.quantities)
         self.error(msg)
     #end if
     q = self.data[quantity]
     results = list()
     nblocks = q.shape[-1]
     qi = zeros((nblocks,))
     if len(domains)==0:
         for b in xrange(nblocks):
             qi[b] = q[...,b].sum()
         #end for
         (mean,var,error,kappa)=simstats(qi)
     else:
         for domain in domains:
             for b in xrange(nblocks):
                 qb = q[...,b]
                 qi[b] = qb[domain].sum()
             #end for                
             (mean,var,error,kappa)=simstats(qi)
             res = QAobject()
             res.mean  = mean
             res.error = error
             res.data  = qi.copy()
             results.append(res)
         #end for
     #end for
     if len(domains)<2:
         return mean,error
     else:
         if not return_list:
             return tuple(results)
         else:
             means = list()
             errors = list()
             for res in results:
                 means.append(res.mean)
                 errors.append(res.error)
             #end for
             return means,errors
Example #3
0
    def correct(self,*corrections):
        corrkey=''
        for corr in corrections:
            corrkey+=corr+'_'
        #end for
        corrkey=corrkey[:-1]
        if set(corrections)>set(self.corrections.keys()):
            self.warn('correction '+corrkey+' is unknown and cannot be applied')
            return
        #end if
        if not 'data' in self:
            self.warn('correction '+corrkey+' cannot be applied because data is not present')
            return
        #end if
        varname = 'LocalEnergy_'+corrkey
        if varname in self and varname in self.data:
            return
        #end if
        corrvars = ['LocalEnergy']
        signs    = [1]
        for corr in corrections:
            for var,sign in self.corrections[corr].iteritems():
                corrvars.append(var)
                signs.append(sign)
            #end for
        #end for
        missing = list(set(corrvars)-set(self.data.keys()))
        if len(missing)>0:            
            self.warn('correction '+corrkey+' cannot be applied because '+str(missing)+' are missing')
            return
        #end if

        le = self.data.LocalEnergy
        E,E2 = 0*le.value,0*le.value_squared
        n = len(corrvars)
        for i in range(n):
            ed = self.data[corrvars[i]]
            e,e2 = ed.value,ed.value_squared
            s = signs[i]
            E += s*e
            E2 += e2
            for j in range(i+1,n):
                eo = self.data[corrvars[j]].value
                so = signs[j]
                E2 += 2*s*e*so*eo
            #end for
        #end for
        val = obj(value=E,value_squared=E2)
        self.data[varname] = val
        nbe = self.info.nblocks_exclude
        (mean,var,error,kappa)=simstats(val.value[nbe:,...].ravel())
        self[varname] = obj(
            mean            = mean,
            variance        = val.value_squared[nbe:,...].mean()-mean**2,
            sample_variance = var,
            error           = error,
            kappa           = kappa
            )
Example #4
0
 def analyze_local(self):
     nbe = QAanalyzer.method_info.nblocks_exclude
     self.info.nblocks_exclude = nbe
     data = self.data
     for varname,samples in data.iteritems():
         (mean,var,error,kappa)=simstats(samples[nbe:])
         self[varname] = obj(
             mean            = mean,
             sample_variance = var,
             error           = error,
             kappa           = kappa
             )
     #end for
     
     if 'LocalEnergy_sq' in data:
         v = data.LocalEnergy_sq - data.LocalEnergy**2
         (mean,var,error,kappa)=simstats(v[nbe:])
         self.LocalEnergyVariance = obj(
             mean            = mean,
             sample_variance = var,
             error           = error,
             kappa           = kappa
             )
Example #5
0
 def analyze_local(self):
     nbe = QAanalyzer.method_info.nblocks_exclude
     self.info.nblocks_exclude = nbe
     for varname,val in self.data.iteritems():
         (mean,var,error,kappa)=simstats(val.value[nbe:,...].ravel())
         self[varname] = obj(
             mean            = mean,
             variance        = val.value_squared[nbe:,...].mean()-mean**2,
             sample_variance = var,
             error           = error,
             kappa           = kappa
             )
     #end for
     self.correct('mpc','kc')
Example #6
0
    def analyze_local(self):
        nbe = QAanalyzer.method_info.nblocks_exclude
        self.info.nblocks_exclude = nbe
        data = self.data

        input       = self.run_info.input
        series      = self.method_info.series
        ndmc_blocks = self.run_info.request.ndmc_blocks

        qmc    = input.simulation.calculations[series]
        blocks = qmc.blocks
        steps  = qmc.steps
        nse    = nbe*steps

        self.info.nsteps_exclude = nse

        nsteps = len(data.list()[0])-nse

        #nsteps = blocks*steps-nse
        block_avg = nsteps > 2*ndmc_blocks
        if block_avg:
            block_size  = int(floor(float(nsteps)/ndmc_blocks))
            ndmc_blocks = int(floor(float(nsteps)/block_size))
            nse += nsteps-ndmc_blocks*block_size
            nsteps      = ndmc_blocks*block_size
        #end if

        for varname,samples in data.iteritems():
            samp = samples[nse:]
            if block_avg:
                samp.shape = ndmc_blocks,block_size
                samp = samp.mean(axis=1)
            #end if
            (mean,var,error,kappa)=simstats(samp)
            self[varname] = obj(
                mean            = mean,
                sample_variance = var,
                error           = error,
                kappa           = kappa
                )
Example #7
0
    def init_from_hdfgroup(self,init):
        #copy all datasets from hdf group
        value_pattern = re.compile('value')
        gmap_pattern = re.compile(r'gmap\d*')
        for k,v in init._iteritems():
            exclude = k[0]=='_' or gmap_pattern.match(k) or value_pattern.match(k)
            if not exclude:
                self.__dict__[k]=v                
            #end if
        #end for

        #convert 1x and 1x1 numpy arrays to just numbers
        #convert Nx1 and 1xN numpy arrays to Nx arrays
        array_type = type(array([]))
        exclude = set(['value','value_squared'])
        for k,v in self._iteritems():
            if k[0]!='_' and type(v)==array_type and k not in exclude:
                sh=v.shape
                ndim = len(sh)
                if ndim==1 and sh[0]==1:
                    self.__dict__[k]=v[0]
                elif ndim==2:
                    if sh[0]==1 and sh[1]==1:
                        self.__dict__[k]=v[0,0]
                    elif sh[0]==1 or sh[1]==1:
                        self.__dict__[k]=v.reshape((sh[0]*sh[1],))
                    #end if
                #end if
            #end if
        #end for

        #set coord string
        self.coord = SpaceGridBase.coord_n2s[self.coordinate]

        #determine if chempot grid
        chempot = 'min_part' in init
        self.chempot = chempot
        if chempot:
            npvalues = self.max_part-self.min_part+1
            self.npvalues = npvalues
        #end if

        #process the data in hdf value,value_squared
        nbe = self.nblocks_exclude
        nquant   = self.nvalues_per_domain
        ndomains = self.ndomains
        nblocks,ntmp = init.value.shape
        self.nblocks = nblocks

        if not chempot:
            value = init.value.reshape(nblocks,ndomains,nquant).transpose(2,1,0)
        else:
            value = init.value.reshape(nblocks,ndomains,npvalues,nquant).transpose(3,2,1,0)
        #end if
        value = value[...,nbe:]

        #(mean,error)=simplestats(value)
        (mean,var,error,kappa)=simstats(value)
        quants = ['D','T','V']
        for i in range(len(quants)):
            q=quants[i]
            self[q].mean  =  mean[i,...]
            self[q].error = error[i,...]
            exec 'i'+q+'='+str(i)
        #end for
        
        E = value[iT,...]+value[iV,...]
#        (mean,error)=simplestats(E)
        (mean,var,error,kappa)=simstats(E)
        self.E.mean  =  mean
        self.E.error = error
        
        P = 2./3.*value[iT,...]+1./3.*value[iV,...]
        #(mean,error)=simplestats(P)
        (mean,var,error,kappa)=simstats(P)
        self.P.mean  =  mean
        self.P.error = error


        #convert all quantities into true densities
        ovol = 1./self.domain_volumes
        sqovol = sqrt(ovol)
        for q in SpaceGridBase.quantities:
            self[q].mean  *= ovol
            self[q].error *= sqovol
        #end for

        #keep original data, if requested
        if self.keep_data:
            self.data = QAobject()
            for i in range(len(quants)):
                q=quants[i]
                self.data[q] = value[i,...]
            #end for
            self.data.E = E
            self.data.P = P
        #end if

        #print 'sg'
        #import code
        #code.interact(local=locals())
            
        return
Example #8
0
    def analyze_local(self):
        from spacegrid import SpaceGrid

        nbe = QAanalyzer.method_info.nblocks_exclude
        self.info.nblocks_exclude = nbe 
        data = self.data

        #why is this called 3 times?
        print nbe

        #transfer hdf data
        sg_pattern = re.compile(r'spacegrid\d*')
        nspacegrids=0
        #  add simple data first
        for k,v in data._iteritems():
            if not sg_pattern.match(k):
                self._add_attribute(k,v)
            else:
                nspacegrids+=1
            #end if
        #end for
        #  add spacegrids second
        opts = QAobject()
        opts.points = self.reference_points
        opts.nblocks_exclude = nbe
        self.spacegrids=[]
        if nspacegrids==0:
            self.spacegrids.append(SpaceGrid(data.spacegrid,opts))
        else:
            for ig in range(nspacegrids):
                sg=SpaceGrid(data['spacegrid'+str(ig+1)],opts)
                self.spacegrids.append(sg)
            #end for
        #end if

        #reorder atomic data to match input file for Voronoi grids
        if self.run_info.type=='bundled':
            self.info.reordered=True
        #end if
        if not self.info.reordered:
            self.reorder_atomic_data()
        #end if

        #convert quantities outside all spacegrids
        outside = QAobject()
        iD,iT,iV = tuple(range(3))        
        outside.D  = QAobject()
        outside.T  = QAobject()
        outside.V  = QAobject()
        outside.E  = QAobject()
        outside.P  = QAobject()

        value = self.outside.value.transpose()[...,nbe:]

        #mean,error = simplestats(value)
        mean,var,error,kappa = simstats(value)
        outside.D.mean   = mean[iD]
        outside.D.error  = error[iD]
        outside.T.mean   = mean[iT]
        outside.T.error  = error[iT]
        outside.V.mean   = mean[iV]
        outside.V.error  = error[iV]

        E  = value[iT,:]+value[iV,:]
        #mean,error = simplestats(E)
        mean,var,error,kappa = simstats(E)
        outside.E.mean  = mean
        outside.E.error = error

        P  = 2./3.*value[iT,:]+1./3.*value[iV,:]
        #mean,error = simplestats(P)
        mean,var,error,kappa = simstats(P)
        outside.P.mean  = mean
        outside.P.error = error

        self.outside = outside

        self.outside.data = obj(
            D = value[iD,:],
            T = value[iT,:],
            V = value[iV,:],
            E = E,
            P = P
            )

        return
Example #9
0
    def init_from_hdfgroup(self, init):
        #copy all datasets from hdf group
        value_pattern = re.compile('value')
        gmap_pattern = re.compile(r'gmap\d*')
        for k, v in init._iteritems():
            exclude = k[0] == '_' or gmap_pattern.match(
                k) or value_pattern.match(k)
            if not exclude:
                self.__dict__[k] = v
            #end if
        #end for

        #convert 1x and 1x1 numpy arrays to just numbers
        #convert Nx1 and 1xN numpy arrays to Nx arrays
        array_type = type(array([]))
        exclude = set(['value', 'value_squared'])
        for k, v in self._iteritems():
            if k[0] != '_' and type(v) == array_type and k not in exclude:
                sh = v.shape
                ndim = len(sh)
                if ndim == 1 and sh[0] == 1:
                    self.__dict__[k] = v[0]
                elif ndim == 2:
                    if sh[0] == 1 and sh[1] == 1:
                        self.__dict__[k] = v[0, 0]
                    elif sh[0] == 1 or sh[1] == 1:
                        self.__dict__[k] = v.reshape((sh[0] * sh[1], ))
                    #end if
                #end if
            #end if
        #end for

        #set coord string
        self.coord = SpaceGridBase.coord_n2s[self.coordinate]

        #determine if chempot grid
        chempot = 'min_part' in init
        self.chempot = chempot
        if chempot:
            npvalues = self.max_part - self.min_part + 1
            self.npvalues = npvalues
        #end if

        #process the data in hdf value,value_squared
        nbe = self.nblocks_exclude
        nquant = self.nvalues_per_domain
        ndomains = self.ndomains
        nblocks, ntmp = init.value.shape
        self.nblocks = nblocks

        if not chempot:
            value = init.value.reshape(nblocks, ndomains,
                                       nquant).transpose(2, 1, 0)
        else:
            value = init.value.reshape(nblocks, ndomains, npvalues,
                                       nquant).transpose(3, 2, 1, 0)
        #end if
        value = value[..., nbe:]

        #(mean,error)=simplestats(value)
        (mean, var, error, kappa) = simstats(value)
        quants = ['D', 'T', 'V']
        for i in range(len(quants)):
            q = quants[i]
            self[q].mean = mean[i, ...]
            self[q].error = error[i, ...]
            exec 'i' + q + '=' + str(i)
        #end for

        E = value[iT, ...] + value[iV, ...]
        #        (mean,error)=simplestats(E)
        (mean, var, error, kappa) = simstats(E)
        self.E.mean = mean
        self.E.error = error

        P = 2. / 3. * value[iT, ...] + 1. / 3. * value[iV, ...]
        #(mean,error)=simplestats(P)
        (mean, var, error, kappa) = simstats(P)
        self.P.mean = mean
        self.P.error = error

        #convert all quantities into true densities
        ovol = 1. / self.domain_volumes
        sqovol = sqrt(ovol)
        for q in SpaceGridBase.quantities:
            self[q].mean *= ovol
            self[q].error *= sqovol
        #end for

        #keep original data, if requested
        if self.keep_data:
            self.data = QAobject()
            for i in range(len(quants)):
                q = quants[i]
                self.data[q] = value[i, ...]
            #end for
            self.data.E = E
            self.data.P = P
        #end if

        #print 'sg'
        #import code
        #code.interact(local=locals())

        return