提交 3b4c7213 authored 作者: Nicolas Bouchard's avatar Nicolas Bouchard

Add degree and radian functions.

上级 b7156718
......@@ -2030,6 +2030,44 @@ class Sqrt(UnaryScalarOp):
sqrt = Sqrt(upgrade_to_float, name='sqrt')
class Deg2Rad(UnaryScalarOp):
def impl(self, x):
return numpy.deg2rad(x)
def grad(self, (x,), (gz,)):
if gz.type in complex_types:
raise NotImplementedError()
if x.type in float_types:
return gz * numpy.pi / 180,
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 = %(x)s * M_PI / 180.0;" % locals()
deg2rad = Deg2Rad(upgrade_to_float, name='deg2rad')
class Rad2Deg(UnaryScalarOp):
def impl(self, x):
return numpy.rad2deg(x)
def grad(self, (x,), (gz,)):
if gz.type in complex_types:
raise NotImplementedError()
if x.type in float_types:
return gz * 180. / numpy.pi,
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 = %(x)s * 180.0 / M_PI;" % locals()
rad2deg = Rad2Deg(upgrade_to_float, name='rad2deg')
class Cos(UnaryScalarOp):
def impl(self, x):
return numpy.cos(x)
......
......@@ -2671,6 +2671,16 @@ def sqrt(a):
"""square root of a"""
@_scal_elemwise_with_nfunc('deg2rad', 1, 1)
def deg2rad(a):
"""convert degree a to radian"""
@_scal_elemwise_with_nfunc('rad2deg', 1, 1)
def rad2deg(a):
"""convert radian a to degree"""
@_scal_elemwise_with_nfunc('cos', 1, 1)
def cos(a):
"""cosine of a"""
......
......@@ -147,6 +147,14 @@ def sqr_inplace(a):
def sqrt_inplace(a):
"""square root of `a` (inplace on `a`)"""
@_scal_inplace
def deg2rad_inplace(a):
"""convert degree `a` to radian(inplace on `a`)"""
@_scal_inplace
def rad2deg_inplace(a):
"""convert radian `a` to degree(inplace on `a`)"""
@_scal_inplace
def cos_inplace(a):
"""cosine of `a` (inplace on `a`)"""
......
......@@ -810,6 +810,10 @@ _good_broadcast_unary_normal_no_complex = dict(
empty=[numpy.asarray([])],
)
_grad_broadcast_unary_normal_no_complex = dict(
normal=[numpy.asarray(rand_ranged(-5, 5, (2, 3)), dtype=floatX)],
corner_case=[corner_case_grad])
_grad_broadcast_unary_normal = dict(
normal=[numpy.asarray(rand_ranged(-5, 5, (2, 3)), dtype=floatX)],
corner_case = [corner_case_grad],
......@@ -1043,6 +1047,30 @@ _good_broadcast_unary_wide = dict(
empty=(numpy.asarray([]),),)
_grad_broadcast_unary_wide = dict(normal=(rand_ranged(-1000, 1000, (2, 3)),),)
Deg2RadTester = makeBroadcastTester(
op=tensor.deg2rad,
expected=numpy.deg2rad,
good=_good_broadcast_unary_normal_no_complex,
grad=_grad_broadcast_unary_normal_no_complex)
Deg2RadInplaceTester = makeBroadcastTester(
op=inplace.deg2rad_inplace,
expected=numpy.deg2rad,
good=_good_broadcast_unary_normal_no_complex,
grad=_grad_broadcast_unary_normal_no_complex,
inplace=True)
Rad2DegTester = makeBroadcastTester(
op=tensor.rad2deg,
expected=numpy.rad2deg,
good=_good_broadcast_unary_normal_no_complex,
grad=_grad_broadcast_unary_normal_no_complex)
Rad2DegInplaceTester = makeBroadcastTester(
op=inplace.rad2deg_inplace,
expected=numpy.rad2deg,
good=_good_broadcast_unary_normal_no_complex,
grad=_grad_broadcast_unary_normal_no_complex,
inplace=True)
SinTester = makeBroadcastTester(op=tensor.sin,
expected=numpy.sin,
good=_good_broadcast_unary_wide,
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论