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
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
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 )
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 )
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')
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 )
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
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
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