def __init__(self, params, valarray=None, response=False, iteration_cb=None): PSweep.__init__(self, iteration_cb) self.response = response self.params = params self._start_at = 0 if valarray is None: ok = 0 try: # are all the value arrays the same length? ok = len(set([len(p.values) for p in params])) except: pass if ok != 1: raise ValueError( 'Valarray needs to be set or all parameters need to set their values.' ) self.num = len(params[0].values) else: if type(valarray) == list: valarray = np.array(valarray) if len(valarray.shape) == 1: valarray = valarray.reshape(1, -1) if not isinstance(valarray, np.ndarray) or valarray.shape[0] != len(params): raise ValueError( 'Valarray needs to be a 2D array with rows = number of params.' ) self.num = valarray.shape[1] for i, p in enumerate(self.params): p.values = valarray[i]
def __init__(self, params, num, ds=False, response=True, iteration_cb=None): PSweep.__init__(self, iteration_cb) self.params = params num = int(num) self.num = num self.ds = ds self.response = response self._start_at = 0 if self.response: # To generate a complete response surface, use Uniform distributions # with the same range as the original distributions. for p in self.params: if ds: p.values = UniformPDF(*p.pdf.range).ds(num) else: p.values = UniformPDF(*p.pdf.range).lhs(num) else: for p in self.params: if ds: p.values = p.pdf.ds(num) else: p.values = p.pdf.lhs(num)
def __init__(self, params, valarray=None, response=False, iteration_cb=None): PSweep.__init__(self, iteration_cb) self.response = response self.params = params self._start_at = 0 if valarray is None: ok = 0 try: # are all the value arrays the same length? ok = len(set([len(p.values) for p in params])) except: pass if ok != 1: raise ValueError('Valarray needs to be set or all parameters need to set their values.') self.num = len(params[0].values) else: if type(valarray) == list: valarray = np.array(valarray) if len(valarray.shape) == 1: valarray = valarray.reshape(1,-1) if not isinstance(valarray, np.ndarray) or valarray.shape[0] != len(params): raise ValueError('Valarray needs to be a 2D array with rows = number of params.') self.num = valarray.shape[1] for i, p in enumerate(self.params): p.values = valarray[i]
def __init__(self, params, numtrajectories,levels,gridjump, response=False, iteration_cb=None): if response: print('Morris method does not support creating response surfaces') raise ValueError #compare the state of the seeds to the ones set in the control script a=pickle(random.getstate()) b=pickle(np.random.get_state()) f=open('random.getstate.2.txt','w') f.write(a) f.close() f=open('np.random.get_state.2.txt','w') f.write(b) f.close() #output of puq run is 1 elementary effect for each parameter per trajectory. #Therefore, each parameter will have *numtrajectories* elementary effects. PSweep.__init__(self, iteration_cb) self.params = params num = int(numtrajectories) self.num = num*(len(params)+1) #total number of model runs for morris self.response = response self._start_at = 0 self.levels=levels self.gridjump=gridjump self._hf=None self._salib_paramFile='==SALib_morris_params==.txt' self._salib_realizationsFile='==SALib_morris_realizations==.txt' self._salib_realizationsFile_verify='==0SALib_morris_realizations==.txt' self._salib_analysisFile='==SALib_morris_outputs==.txt' #generate morris samples N(D+1) x D numpy array. Rows are realizations, columns are params #Each column is independent in the range [0,1] #TODO: allow for correlation self._samples=SAs.morris_oat.sample(N=num,D=len(params),num_levels=levels,grid_jump=gridjump) #puq will evaluate the output by picking a sample from each parameter in the #order specified in p.values i=0 f=open(self._salib_paramFile,'w') for p in self.params: #map each column of _samples to a parameter, using the inverse cdf to transform it #into the appropriate distribution. p.values = p.pdf.ppf(self._samples[:,i]) i+=1 f.write('{}\t{}\t{}\n'.format(p.name,p.pdf.range[0],p.pdf.range[1])) f.close() #save the samples, as constructed by SALib for verification later. # --removed. save the file directly instead since it was verified # that puq evaluates the output in the order specified in p.values for each param. #np.savetxt(self._salib_realizationsFile_verify,self._samples) np.savetxt(self._salib_realizationsFile,self._samples)
def __init__(self, params, num, response=True, iteration_cb=None): PSweep.__init__(self, iteration_cb) self.params = params num = int(num) self.num = num self.response = response self._start_at = 0 if self.response: # To generate a complete response surface, use Uniform distributions # with the same range as the original distributions. for p in self.params: p.values = UniformPDF(*p.pdf.range).random(num) else: for p in self.params: p.values = p.pdf.random(num)
def __init__(self, params, level, iteration_cb=None): PSweep.__init__(self, iteration_cb) self.params = params self.level = int(level) self._calculate_params()
def __init__(self, params, numtrajectories, levels, gridjump, response=False, iteration_cb=None): if response: print('Morris method does not support creating response surfaces') raise ValueError #compare the state of the seeds to the ones set in the control script a = pickle(random.getstate()) b = pickle(np.random.get_state()) f = open('random.getstate.2.txt', 'w') f.write(a) f.close() f = open('np.random.get_state.2.txt', 'w') f.write(b) f.close() #output of puq run is 1 elementary effect for each parameter per trajectory. #Therefore, each parameter will have *numtrajectories* elementary effects. PSweep.__init__(self, iteration_cb) self.params = params num = int(numtrajectories) self.num = num * (len(params) + 1 ) #total number of model runs for morris self.response = response self._start_at = 0 self.levels = levels self.gridjump = gridjump self._hf = None self._salib_paramFile = '==SALib_morris_params==.txt' self._salib_realizationsFile = '==SALib_morris_realizations==.txt' self._salib_realizationsFile_verify = '==0SALib_morris_realizations==.txt' self._salib_analysisFile = '==SALib_morris_outputs==.txt' #generate morris samples N(D+1) x D numpy array. Rows are realizations, columns are params #Each column is independent in the range [0,1] #TODO: allow for correlation self._samples = SAs.morris_oat.sample(N=num, D=len(params), num_levels=levels, grid_jump=gridjump) #puq will evaluate the output by picking a sample from each parameter in the #order specified in p.values i = 0 f = open(self._salib_paramFile, 'w') for p in self.params: #map each column of _samples to a parameter, using the inverse cdf to transform it #into the appropriate distribution. p.values = p.pdf.ppf(self._samples[:, i]) i += 1 f.write('{}\t{}\t{}\n'.format(p.name, p.pdf.range[0], p.pdf.range[1])) f.close() #save the samples, as constructed by SALib for verification later. # --removed. save the file directly instead since it was verified # that puq evaluates the output in the order specified in p.values for each param. #np.savetxt(self._salib_realizationsFile_verify,self._samples) np.savetxt(self._salib_realizationsFile, self._samples)