提交 23886e9c authored 作者: Nicolas Bouchard's avatar Nicolas Bouchard

pep8

上级 dcd48dd0
...@@ -2,8 +2,12 @@ ...@@ -2,8 +2,12 @@
#as scipy is not always available, we put threat them separatly #as scipy is not always available, we put threat them separatly
import numpy import numpy
from theano.scalar.basic import UnaryScalarOp,exp,upgrade_to_float,float_types from theano.scalar.basic import (UnaryScalarOp,
from theano.scalar.basic import upgrade_to_float_no_complex,complex_types,upcast exp, upgrade_to_float,
float_types)
from theano.scalar.basic import (upgrade_to_float_no_complex,
complex_types,
upcast)
imported_scipy_special = False imported_scipy_special = False
try: try:
...@@ -12,46 +16,54 @@ try: ...@@ -12,46 +16,54 @@ try:
except ImportError: except ImportError:
pass pass
class Erf(UnaryScalarOp): class Erf(UnaryScalarOp):
def impl(self, x): def impl(self, x):
if imported_scipy_special: if imported_scipy_special:
return scipy.special.erf(x) return scipy.special.erf(x)
else: else:
super(Erf,self).impl(x) super(Erf, self).impl(x)
def grad(self, inp, grads): def grad(self, inp, grads):
x, = inp x, = inp
gz, = grads gz, = grads
if x.type in complex_types: if x.type in complex_types:
raise NotImplementedError() raise NotImplementedError()
elif x.type in float_types: elif x.type in float_types:
cst = numpy.asarray(2. / numpy.sqrt(numpy.pi),dtype=upcast(x.type.dtype,gz.type.dtype)) cst = numpy.asarray(2. / numpy.sqrt(numpy.pi),
return gz * cst * exp(-x*x), dtype=upcast(x.type.dtype, gz.type.dtype))
return gz * cst * exp(-x * x),
else: else:
return None, return None,
def c_code(self, node, name, inp, out, sub): def c_code(self, node, name, inp, out, sub):
x, = inp x, = inp
z, = out z, = out
if node.inputs[0].type in complex_types: if node.inputs[0].type in complex_types:
raise NotImplementedError('type not supported', type) raise NotImplementedError('type not supported', type)
return "%(z)s = erf(%(x)s);" % locals() return "%(z)s = erf(%(x)s);" % locals()
erf = Erf(upgrade_to_float, name= 'erf') erf = Erf(upgrade_to_float, name='erf')
class Erfc(UnaryScalarOp): class Erfc(UnaryScalarOp):
def impl(self, x): def impl(self, x):
if imported_scipy_special: if imported_scipy_special:
return scipy.special.erfc(x) return scipy.special.erfc(x)
else: else:
super(Erfc,self).impl(x) super(Erfc, self).impl(x)
def grad(self, inp, grads): def grad(self, inp, grads):
x, = inp x, = inp
gz, = grads gz, = grads
if x.type in complex_types: if x.type in complex_types:
raise NotImplementedError() raise NotImplementedError()
elif x.type in float_types: elif x.type in float_types:
cst = numpy.asarray(2. / numpy.sqrt(numpy.pi),dtype=upcast(x.type.dtype,gz.type.dtype)) cst = numpy.asarray(2. / numpy.sqrt(numpy.pi),
return - gz * cst * exp(-x*x), dtype=upcast(x.type.dtype, gz.type.dtype))
return - gz * cst * exp(-x * x),
else: else:
return None, return None,
def c_code(self, node, name, inp, out, sub): def c_code(self, node, name, inp, out, sub):
x, = inp x, = inp
z, = out z, = out
...@@ -60,8 +72,7 @@ class Erfc(UnaryScalarOp): ...@@ -60,8 +72,7 @@ class Erfc(UnaryScalarOp):
return "%(z)s = erfc(%(x)s);" % locals() return "%(z)s = erfc(%(x)s);" % locals()
# scipy.special.erfc don't support complex. Why? # scipy.special.erfc don't support complex. Why?
erfc = Erfc(upgrade_to_float_no_complex, name = 'erfc') erfc = Erfc(upgrade_to_float_no_complex, name='erfc')
class GammaLn(UnaryScalarOp): class GammaLn(UnaryScalarOp):
...@@ -71,12 +82,15 @@ class GammaLn(UnaryScalarOp): ...@@ -71,12 +82,15 @@ class GammaLn(UnaryScalarOp):
@staticmethod @staticmethod
def st_impl(x): def st_impl(x):
return special.gammaln(x) return special.gammaln(x)
def impl(self, x): def impl(self, x):
return GammaLn.st_impl(x) return GammaLn.st_impl(x)
def grad(self, inp, grads): def grad(self, inp, grads):
x, = inp x, = inp
gz, = grads gz, = grads
return [gz * psi(x)] return [gz * psi(x)]
def c_code(self, node, name, inp, out, sub): def c_code(self, node, name, inp, out, sub):
x, = inp x, = inp
z, = out z, = out
...@@ -84,11 +98,12 @@ class GammaLn(UnaryScalarOp): ...@@ -84,11 +98,12 @@ class GammaLn(UnaryScalarOp):
return """%(z)s = return """%(z)s =
lgamma(%(x)s);""" % locals() lgamma(%(x)s);""" % locals()
raise NotImplementedError('only floatingpoint is implemented') raise NotImplementedError('only floatingpoint is implemented')
def __eq__(self, other): def __eq__(self, other):
return type(self) == type(other) return type(self) == type(other)
def __hash__(self): def __hash__(self):
return hash(type(self)) return hash(type(self))
gammaln = GammaLn(upgrade_to_float, name='gammaln') gammaln = GammaLn(upgrade_to_float, name='gammaln')
...@@ -99,6 +114,7 @@ class Psi(UnaryScalarOp): ...@@ -99,6 +114,7 @@ class Psi(UnaryScalarOp):
@staticmethod @staticmethod
def st_impl(x): def st_impl(x):
return special.psi(x) return special.psi(x)
def impl(self, x): def impl(self, x):
return Psi.st_impl(x) return Psi.st_impl(x)
...@@ -106,13 +122,14 @@ class Psi(UnaryScalarOp): ...@@ -106,13 +122,14 @@ class Psi(UnaryScalarOp):
def c_support_code(self): def c_support_code(self):
return ( return (
""" """
#ifndef _PSIFUNCDEFINED #ifndef _PSIFUNCDEFINED
#define _PSIFUNCDEFINED #define _PSIFUNCDEFINED
double _psi(double x){ double _psi(double x){
/*taken from /*taken from
Bernardo, J. M. (1976). Algorithm AS 103: Psi (Digamma) Function. Applied Statistics. 25 (3), 315-317. Bernardo, J. M. (1976). Algorithm AS 103:
Psi (Digamma) Function. Applied Statistics. 25 (3), 315-317.
http://www.uv.es/~bernardo/1976AppStatist.pdf */ http://www.uv.es/~bernardo/1976AppStatist.pdf */
double y, R, psi_ = 0; double y, R, psi_ = 0;
...@@ -121,7 +138,7 @@ double _psi(double x){ ...@@ -121,7 +138,7 @@ double _psi(double x){
double S3 = 8.333333333e-2; double S3 = 8.333333333e-2;
double S4 = 8.333333333e-3; double S4 = 8.333333333e-3;
double S5 = 3.968253968e-3; double S5 = 3.968253968e-3;
double D1 = -0.5772156649 ; double D1 = -0.5772156649;
y = x; y = x;
...@@ -143,6 +160,7 @@ double _psi(double x){ ...@@ -143,6 +160,7 @@ double _psi(double x){
return psi_;} return psi_;}
#endif #endif
""" ) """ )
def c_code(self, node, name, inp, out, sub): def c_code(self, node, name, inp, out, sub):
x, = inp x, = inp
z, = out z, = out
...@@ -153,7 +171,7 @@ double _psi(double x){ ...@@ -153,7 +171,7 @@ double _psi(double x){
def __eq__(self, other): def __eq__(self, other):
return type(self) == type(other) return type(self) == type(other)
def __hash__(self): def __hash__(self):
return hash(type(self)) return hash(type(self))
psi = Psi(upgrade_to_float, name='psi') psi = Psi(upgrade_to_float, name='psi')
...@@ -2639,10 +2639,12 @@ def erf(a): ...@@ -2639,10 +2639,12 @@ def erf(a):
def erfc(a): def erfc(a):
"""complementary error function""" """complementary error function"""
@_scal_elemwise @_scal_elemwise
def gammaln(a): def gammaln(a):
"""log gamma function""" """log gamma function"""
@_scal_elemwise @_scal_elemwise
def psi(a): def psi(a):
"""derivative of log gamma function""" """derivative of log gamma function"""
......
...@@ -1246,69 +1246,77 @@ else: ...@@ -1246,69 +1246,77 @@ else:
expected_erfc = [] expected_erfc = []
skip_scipy = "scipy is not present" skip_scipy = "scipy is not present"
ErfTester = makeBroadcastTester(op = tensor.erf, ErfTester = makeBroadcastTester(
expected = expected_erf, op=tensor.erf,
good = _good_broadcast_unary_normal, expected=expected_erf,
grad = _grad_broadcast_unary_normal, good=_good_broadcast_unary_normal,
eps = 2e-10, grad=_grad_broadcast_unary_normal,
mode = mode_no_scipy, eps=2e-10,
skip = skip_scipy) mode=mode_no_scipy,
ErfInplaceTester = makeBroadcastTester(op = inplace.erf_inplace, skip=skip_scipy)
expected = expected_erf, ErfInplaceTester = makeBroadcastTester(
good = _good_broadcast_unary_normal_no_int, op=inplace.erf_inplace,
grad = _grad_broadcast_unary_normal, expected=expected_erf,
mode = mode_no_scipy, good=_good_broadcast_unary_normal_no_int,
eps = 2e-10, grad=_grad_broadcast_unary_normal,
inplace = True, mode=mode_no_scipy,
skip = skip_scipy) eps=2e-10,
inplace=True,
ErfcTester = makeBroadcastTester(op = tensor.erfc, skip=skip_scipy)
expected = expected_erfc,
good = _good_broadcast_unary_normal_no_int_no_complex, ErfcTester = makeBroadcastTester(
grad = _grad_broadcast_unary_normal, op=tensor.erfc,
eps = 2e-10, expected=expected_erfc,
mode = mode_no_scipy, good=_good_broadcast_unary_normal_no_int_no_complex,
skip = skip_scipy) grad=_grad_broadcast_unary_normal,
ErfcInplaceTester = makeBroadcastTester(op = inplace.erfc_inplace, eps=2e-10,
expected = expected_erfc, mode=mode_no_scipy,
good = _good_broadcast_unary_normal_no_int_no_complex, skip=skip_scipy)
grad = _grad_broadcast_unary_normal, ErfcInplaceTester = makeBroadcastTester(
eps = 2e-10, op=inplace.erfc_inplace,
mode = mode_no_scipy, expected=expected_erfc,
inplace = True, good=_good_broadcast_unary_normal_no_int_no_complex,
skip = skip_scipy) grad=_grad_broadcast_unary_normal,
eps=2e-10,
GammaLnTester = makeBroadcastTester(op = tensor.gammaln, mode=mode_no_scipy,
expected = expected_gammaln, inplace=True,
good = _good_broadcast_unary_normal_no_int_no_complex, skip=skip_scipy)
grad = _grad_broadcast_unary_normal,
eps = 2e-10, GammaLnTester = makeBroadcastTester(
mode = mode_no_scipy, op=tensor.gammaln,
skip = skip_scipy) expected=expected_gammaln,
GammaLnInplaceTester = makeBroadcastTester(op = inplace.gammaln_inplace, good=_good_broadcast_unary_normal_no_int_no_complex,
expected = expected_erfc, grad=_grad_broadcast_unary_normal,
good = _good_broadcast_unary_normal_no_int_no_complex, eps=2e-10,
grad = _grad_broadcast_unary_normal, mode=mode_no_scipy,
eps = 2e-10, skip=skip_scipy)
mode = mode_no_scipy, GammaLnInplaceTester = makeBroadcastTester(
inplace = True, op=inplace.gammaln_inplace,
skip = skip_scipy) expected=expected_erfc,
good=_good_broadcast_unary_normal_no_int_no_complex,
PsiTester = makeBroadcastTester(op = tensor.psi, grad=_grad_broadcast_unary_normal,
expected = expected_psi, eps=2e-10,
good = _good_broadcast_unary_normal_no_int_no_complex, mode=mode_no_scipy,
grad = _grad_broadcast_unary_normal, inplace=True,
eps = 2e-10, skip=skip_scipy)
mode = mode_no_scipy,
skip = skip_scipy) PsiTester = makeBroadcastTester(
PsiInplaceTester = makeBroadcastTester(op = inplace.psi_inplace, op=tensor.psi,
expected = expected_psi, expected=expected_psi,
good = _good_broadcast_unary_normal_no_int_no_complex, good=_good_broadcast_unary_normal_no_int_no_complex,
grad = _grad_broadcast_unary_normal, grad=_grad_broadcast_unary_normal,
eps = 2e-10, eps=2e-10,
mode = mode_no_scipy, mode=mode_no_scipy,
inplace = True, skip=skip_scipy)
skip = skip_scipy) PsiInplaceTester = makeBroadcastTester(
op=inplace.psi_inplace,
expected=expected_psi,
good=_good_broadcast_unary_normal_no_int_no_complex,
grad=_grad_broadcast_unary_normal,
eps=2e-10,
mode=mode_no_scipy,
inplace=True,
skip=skip_scipy)
ZerosLikeTester = makeBroadcastTester( ZerosLikeTester = makeBroadcastTester(
op=tensor.zeros_like, op=tensor.zeros_like,
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论