コード例 #1
0
 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]
コード例 #2
0
ファイル: lhs.py プロジェクト: zoidy/puq
    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)
コード例 #3
0
ファイル: simplesweep.py プロジェクト: wang159/puq
 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]
コード例 #4
0
ファイル: morris.py プロジェクト: zoidy/puq
    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)
コード例 #5
0
ファイル: montecarlo.py プロジェクト: dalg24/puq
    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)
コード例 #6
0
 def __init__(self, params, level, iteration_cb=None):
     PSweep.__init__(self, iteration_cb)
     self.params = params
     self.level = int(level)
     self._calculate_params()
コード例 #7
0
ファイル: smolyak.py プロジェクト: zoidy/puq
 def __init__(self, params, level, iteration_cb=None):
     PSweep.__init__(self, iteration_cb)
     self.params = params
     self.level = int(level)
     self._calculate_params()
コード例 #8
0
ファイル: morris.py プロジェクト: zoidy/puq
    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)