[edit] subclassing has been substituted by classmethod fromPick opportunity for creating a PDF object
This commit is contained in:
		
							parent
							
								
									e7a5e388f6
								
							
						
					
					
						commit
						2956f3b733
					
				| @ -8,6 +8,13 @@ __version__ = _getVersionString() | ||||
| __author__ = 'sebastianw' | ||||
| 
 | ||||
| 
 | ||||
| def create_axis(x0, incr, npts): | ||||
|     ax = np.zeros(npts) | ||||
|     for i in range(npts): | ||||
|         ax[i] = x0 + incr * i | ||||
|     return ax | ||||
| 
 | ||||
| 
 | ||||
| def gauss_parameter(te, tm, tl, eta): | ||||
|     ''' | ||||
|     takes three onset times and returns the parameters sig1, sig2, a1 and a2 | ||||
| @ -109,19 +116,22 @@ class ProbabilityDensityFunction(object): | ||||
| 
 | ||||
|     version = __version__ | ||||
| 
 | ||||
|     def __init__(self, x, pdf): | ||||
|         self.axis = x | ||||
|     def __init__(self, x0, incr, npts, pdf): | ||||
|         self.x0 = x0 | ||||
|         self.incr = incr | ||||
|         self.npts = npts | ||||
|         self.axis = create_axis(x0, incr, npts) | ||||
|         self.data = pdf | ||||
| 
 | ||||
|     def __add__(self, other): | ||||
|         assert isinstance(other, ProbabilityDensityFunction), \ | ||||
|             'both operands must be of type ProbabilityDensityFunction' | ||||
| 
 | ||||
|         x, pdf_self, pdf_other = self.rearrange(other) | ||||
|         incr, limits, pdf_self, pdf_other = self.rearrange(other) | ||||
| 
 | ||||
|         pdf = np.convolve(pdf_self, pdf_other, 'same') * self.delta() | ||||
| 
 | ||||
|         return ProbabilityDensityFunction(x, pdf) | ||||
|         return ProbabilityDensityFunction(incr, limits, pdf) | ||||
| 
 | ||||
|     def __sub__(self, other): | ||||
|         assert isinstance(other, ProbabilityDensityFunction), \ | ||||
| @ -138,22 +148,38 @@ class ProbabilityDensityFunction(object): | ||||
| 
 | ||||
|     @property | ||||
|     def data(self): | ||||
|         return self.data | ||||
|         return self._pdf | ||||
| 
 | ||||
|     @data.setter | ||||
|     def data(self, pdf): | ||||
|         self.data = np.array(pdf) | ||||
|         self._pdf = np.array(pdf) | ||||
| 
 | ||||
|     @property | ||||
|     def axis(self): | ||||
|         return self.axis | ||||
|         return self._x | ||||
| 
 | ||||
|     @axis.setter | ||||
|     def axis(self, x): | ||||
|         self.axis = np.array(x) | ||||
|         self._x = np.array(x) | ||||
| 
 | ||||
|     def delta(self): | ||||
|         return self.axis[1] - self.axis[0] | ||||
|     @classmethod | ||||
|     def fromPick(self, incr, lbound, midpoint, rbound, decfact=0.01, type='gauss'): | ||||
|         ''' | ||||
|         Initialize a new ProbabilityDensityFunction object. | ||||
|         Takes incr, lbound, midpoint and rbound to derive x0 and the number | ||||
|         of points npts for the axis vector. | ||||
|         Maximum density | ||||
|         is given at the midpoint and on the boundaries the function has | ||||
|         declined to decfact times the maximum value. Integration of the | ||||
|         function over a particular interval gives the probability for the | ||||
|         variable value to be in that interval. | ||||
|         ''' | ||||
|         margin = 1.5 * np.max(midpoint - lbound, rbound - midpoint) | ||||
|         x0 = midpoint - margin | ||||
|         npts = 2 * int(margin // incr) | ||||
|         params = parameter[type](lbound, midpoint, rbound, decfact) | ||||
|         pdf = branches[type](create_axis(x0, incr, npts), midpoint, *params) | ||||
|         return ProbabilityDensityFunction(x0, incr, npts, pdf) | ||||
| 
 | ||||
|     def rearrange(self, other, plus=True): | ||||
|         ''' | ||||
| @ -200,44 +226,3 @@ class ProbabilityDensityFunction(object): | ||||
|         pdf_other[ostart:o_end] = other.data | ||||
| 
 | ||||
|         return x, pdf_self, pdf_other | ||||
| 
 | ||||
| 
 | ||||
| class PickPDF(ProbabilityDensityFunction): | ||||
| 
 | ||||
|     def __init__(self, x, lbound, midpoint, rbound, decfact=0.01, type='gauss'): | ||||
|         ''' | ||||
|         Initialize a new ProbabilityDensityFunction object. Takes arguments x, | ||||
|         lbound, midpoint and rbound to define a probability density function | ||||
|         defined on the interval of x. Maximum density is given at the midpoint | ||||
|         and on the boundaries the function has declined to decfact times the | ||||
|         maximum value. Integration of the function over a particular interval | ||||
|         gives the probability for the variable value to lie in that interval. | ||||
|         :param x: interval on which the pdf is defined | ||||
|         :param lbound: left boundary | ||||
|         :param midpoint: point of maximum probability density | ||||
|         :param rbound: right boundary | ||||
|         :param decfact: boundary decline factor | ||||
|         :param type: determines the type of the probability density function's | ||||
|          branches | ||||
|         ''' | ||||
| 
 | ||||
|         self.nodes = dict(te=lbound, tm=midpoint, tl=rbound, eta=decfact) | ||||
|         self.type = type | ||||
|         super(PickPDF, self).__init__(x, self.pdf()) | ||||
| 
 | ||||
|     @property | ||||
|     def type(self): | ||||
|         return self.type | ||||
| 
 | ||||
|     @type.setter | ||||
|     def type(self, type): | ||||
|         self.type = type | ||||
| 
 | ||||
|     def params(self): | ||||
|         return parameter[self.type](**self.nodes) | ||||
| 
 | ||||
|     def get(self, key): | ||||
|         return self.nodes[key] | ||||
| 
 | ||||
|     def pdf(self): | ||||
|         return branches[self.type](self.axis, self.get('tm'), *self.params()) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user