提交 ab2bdf83 authored 作者: Ian Goodfellow's avatar Ian Goodfellow

added arccos

上级 7f6a333b
...@@ -1716,6 +1716,22 @@ class Cos(UnaryScalarOp): ...@@ -1716,6 +1716,22 @@ class Cos(UnaryScalarOp):
return "%(z)s = cos(%(x)s);" % locals() return "%(z)s = cos(%(x)s);" % locals()
cos = Cos(upgrade_to_float, name = 'cos') cos = Cos(upgrade_to_float, name = 'cos')
class Arccos(UnaryScalarOp):
def impl(self, x):
return numpy.arccos(x)
def grad(self, (x, ), (gz, )):
if gz.type in complex_types:
raise NotImplementedError()
if x.type in float_types:
return - gz / sqrt(numpy.cast[x.type](1) - sqr(x)),
else:
return None,
def c_code(self, node, name, (x, ), (z, ), sub):
if node.inputs[0].type in complex_types:
raise NotImplementedError('type not supported', type)
return "%(z)s = acos(%(x)s);" % locals()
arccos = Arccos(upgrade_to_float, name = 'cos')
class Sin(UnaryScalarOp): class Sin(UnaryScalarOp):
def impl(self, x): def impl(self, x):
return numpy.sin(x) return numpy.sin(x)
......
...@@ -2284,6 +2284,10 @@ def sqrt(a): ...@@ -2284,6 +2284,10 @@ def sqrt(a):
def cos(a): def cos(a):
"""cosine of a""" """cosine of a"""
@_scal_elemwise_with_nfunc('arccos',1,1)
def arccos(a):
"""arccosine of a"""
@_scal_elemwise_with_nfunc('sin', 1, 1) @_scal_elemwise_with_nfunc('sin', 1, 1)
def sin(a): def sin(a):
"""sine of a""" """sine of a"""
......
...@@ -144,6 +144,10 @@ def sqrt_inplace(a): ...@@ -144,6 +144,10 @@ def sqrt_inplace(a):
def cos_inplace(a): def cos_inplace(a):
"""cosine of `a` (inplace on `a`)""" """cosine of `a` (inplace on `a`)"""
@_scal_inplace
def arccos_inplace(a):
"""arccosine of `a` (inplace on `a`)"""
@_scal_inplace @_scal_inplace
def sin_inplace(a): def sin_inplace(a):
"""sine of `a` (inplace on `a`)""" """sine of `a` (inplace on `a`)"""
......
...@@ -791,6 +791,16 @@ _grad_broadcast_unary_wide = dict(normal = (rand_ranged(-1000, 1000, (2, 3)),), ...@@ -791,6 +791,16 @@ _grad_broadcast_unary_wide = dict(normal = (rand_ranged(-1000, 1000, (2, 3)),),
#empty = (numpy.asarray([]),), #empty = (numpy.asarray([]),),
) )
_good_broadcast_unary_arccos = dict(normal = (rand_ranged(-1.+1e-7, 1.-1e-7, (2, 3)),),
integers = (randint_ranged(-1.+1e-7, 1-1e-7, (2, 3)),),
complex = (randc128_ranged(-1.+1e-7, 1-1e-7, (2, 3)),),
empty = (numpy.asarray([]),),)
_grad_broadcast_unary_arccos = dict(normal = (rand_ranged(-1.+1e-7, 1-1e-7, (2, 3)),),
#complex = (randc128_ranged(-1000, 1000, (2, 3)),),
#empty = (numpy.asarray([]),),
)
SinTester = makeBroadcastTester(op = sin, SinTester = makeBroadcastTester(op = sin,
expected = numpy.sin, expected = numpy.sin,
...@@ -811,6 +821,15 @@ CosInplaceTester = makeBroadcastTester(op = inplace.cos_inplace, ...@@ -811,6 +821,15 @@ CosInplaceTester = makeBroadcastTester(op = inplace.cos_inplace,
good = _good_broadcast_unary_wide, good = _good_broadcast_unary_wide,
grad = _grad_broadcast_unary_wide, grad = _grad_broadcast_unary_wide,
inplace = True) inplace = True)
ArccosTester = makeBroadcastTester(op = arccos,
expected = numpy.arccos,
good = _good_broadcast_unary_arccos,
grad = _grad_broadcast_unary_arccos)
ArccosInplaceTester = makeBroadcastTester(op = inplace.arccos_inplace,
expected = numpy.arccos,
good = _good_broadcast_unary_arccos,
grad = _grad_broadcast_unary_arccos,
inplace = True)
tan_grad_rtol = None tan_grad_rtol = None
if config.floatX=='float32': if config.floatX=='float32':
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论