[Scipy-svn] r5167 - in trunk/scipy/stats: . tests

scipy-svn at scipy.org scipy-svn at scipy.org
Sat Nov 22 11:10:19 EST 2008


Author: josef
Date: 2008-11-22 10:10:16 -0600 (Sat, 22 Nov 2008)
New Revision: 5167

Modified:
   trunk/scipy/stats/distributions.py
   trunk/scipy/stats/tests/test_continuous_basic.py
Log:
genextreme: correct _argcheck for c close to zero, allow array argument in _cdf

Modified: trunk/scipy/stats/distributions.py
===================================================================
--- trunk/scipy/stats/distributions.py	2008-11-22 14:40:43 UTC (rev 5166)
+++ trunk/scipy/stats/distributions.py	2008-11-22 16:10:16 UTC (rev 5167)
@@ -14,7 +14,7 @@
 from numpy import alltrue, where, arange, put, putmask, \
      ravel, take, ones, sum, shape, product, repeat, reshape, \
      zeros, floor, logical_and, log, sqrt, exp, arctanh, tan, sin, arcsin, \
-     arctan, tanh, ndarray, cos, cosh, sinh, newaxis, array
+     arctan, tanh, ndarray, cos, cosh, sinh, newaxis, array, log1p, expm1
 from numpy import atleast_1d, polyval, angle, ceil, place, extract, \
      any, argsort, argmax, vectorize, r_, asarray, nan, inf, pi, isnan, isinf, \
      power
@@ -49,6 +49,8 @@
            'poisson', 'planck', 'boltzmann', 'randint', 'zipf', 'dlaplace',
           ]
 
+floatinfo = numpy.finfo(float)
+
 errp = special.errprint
 arr = asarray
 gam = special.gamma
@@ -1744,7 +1746,7 @@
 
 ## Generalized Extreme Value
 ##  c=0 is just gumbel distribution.
-##  This version does not accept c==0
+##  This version does now accept c==0
 ##  Use gumbel_r for c==0
 
 # new version by Per Brodtkorb, see ticket:767
@@ -1753,18 +1755,23 @@
 
 class genextreme_gen(rv_continuous):
     def _argcheck(self, c):
-        self.b = where(c > 0, 1.0 / c, inf)
-        self.a = where(c < 0, 1.0 / c, -inf)       
-        return (c==c) #True #(c!=0) #see ticket:793
+        min = np.minimum
+        max = np.maximum
+        sml = floatinfo.machar.xmin
+        #self.b = where(c > 0, 1.0 / c,inf)
+        #self.a = where(c < 0, 1.0 / c, -inf)
+        self.b = where(c > 0, 1.0 / max(c, sml),inf)
+        self.a = where(c < 0, 1.0 / min(c,-sml), -inf)
+        return where(abs(c)==inf, 0, 1) #True #(c!=0)
     def _pdf(self, x, c):
         ##        ex2 = 1-c*x
         ##        pex2 = pow(ex2,1.0/c)
         ##        p2 = exp(-pex2)*pex2/ex2
         ##        return p2
         cx = c*x
-        # Note: fit method requires that _pdf accepts vector x
-        logex2 = where((x==x)*(c==0),0.0,np.log1p(-cx))
-        logpex2 = where((x==x)*(c==0),-x,logex2/c)
+
+        logex2 = where((c==0)*(x==x),0.0,log1p(-cx))
+        logpex2 = where((c==0)*(x==x),-x,logex2/c)
         pex2 = exp(logpex2)
         # % Handle special cases
         logpdf = where((cx==1) | (cx==-inf),-inf,-pex2+logpex2-logex2)
@@ -1775,15 +1782,13 @@
 
     def _cdf(self, x, c):
         #return exp(-pow(1-c*x,1.0/c))
-        loglogcdf = where(c==0,-x,np.log1p(-c*x)/c)
+        loglogcdf = where((c==0)*(x==x),-x,log1p(-c*x)/c)
         return exp(-exp(loglogcdf))
 
     def _ppf(self, q, c):
         #return 1.0/c*(1.-(-log(q))**c)
-        logq = log(q);
-        x = -log(-logq)
-        # _rvs requires that _ppf allows vectorized q
-        return where((q==q)*(c==0),x,-np.expm1(-c*x)/c)
+        x = -log(-log(q))
+        return where((c==0)*(x==x),x,-expm1(-c*x)/c)
     def _stats(self,c):
 
         g = lambda n : gam(n*c+1)
@@ -1792,9 +1797,9 @@
         g3 = g(3);
         g4 = g(4)
         g2mg12 = where(abs(c)<1e-7,(c*pi)**2.0/6.0,g2-g1**2.0)
-        gam2k = where(abs(c)<1e-7,pi**2.0/6.0, np.expm1(gamln(2.0*c+1.0)-2*gamln(c+1.0))/c**2.0);
+        gam2k = where(abs(c)<1e-7,pi**2.0/6.0, expm1(gamln(2.0*c+1.0)-2*gamln(c+1.0))/c**2.0);
         eps = 1e-14
-        gamk = where(abs(c)<eps,-_EULER,np.expm1(gamln(c+1))/c)
+        gamk = where(abs(c)<eps,-_EULER,expm1(gamln(c+1))/c)
 
         m = where(c<-1.0,nan,-gamk)
         v = where(c<-0.5,nan,g1**2.0*gam2k)

Modified: trunk/scipy/stats/tests/test_continuous_basic.py
===================================================================
--- trunk/scipy/stats/tests/test_continuous_basic.py	2008-11-22 14:40:43 UTC (rev 5166)
+++ trunk/scipy/stats/tests/test_continuous_basic.py	2008-11-22 16:10:16 UTC (rev 5167)
@@ -117,7 +117,9 @@
 ##distcont = [
 ##    ['genextreme', (3.3184017469423535,)],
 ##    ['genextreme', (0.01,)],
-##    ['genextreme', (0.00001,)]
+##    ['genextreme', (0.00001,)],
+##    ['genextreme', (0.0,)],
+##    ['genextreme', (-0.01,)]
 ##    ]
 
 def test_cont_basic():




More information about the Scipy-svn mailing list