Skip to content

Commit

Permalink
Merge pull request #680 from evalf/evaluable
Browse files Browse the repository at this point in the history
Evaluable
  • Loading branch information
gertjanvanzwieten committed May 16, 2022
2 parents 7f36eae + 2405480 commit 280e6d7
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 18 deletions.
36 changes: 32 additions & 4 deletions nutils/evaluable.py
Original file line number Diff line number Diff line change
Expand Up @@ -2356,6 +2356,34 @@ class ArcTan(Pointwise):
complex_deriv = lambda x: reciprocal(1+x**2),


class CosH(Pointwise):
'Hyperbolic cosine, element-wise.'
__slots__ = ()
evalf = numpy.cosh
complex_deriv = lambda x: SinH(x),


class SinH(Pointwise):
'Hyperbolic sine, element-wise.'
__slots__ = ()
evalf = numpy.sinh
complex_deriv = CosH,


class TanH(Pointwise):
'Hyperbolic tangent, element-wise.'
__slots__ = ()
evalf = numpy.tanh
complex_deriv = lambda x: 1 - TanH(x)**2,


class ArcTanH(Pointwise):
'Inverse tangent, element-wise.'
__slots__ = ()
evalf = numpy.arctanh
complex_deriv = lambda x: reciprocal(1-x**2),


class Exp(Pointwise):
__slots__ = ()
evalf = numpy.exp
Expand Down Expand Up @@ -4365,19 +4393,19 @@ def abs(arg):


def sinh(arg):
return .5 * (exp(arg) - exp(-arg))
return SinH(arg)


def cosh(arg):
return .5 * (exp(arg) + exp(-arg))
return CosH(arg)


def tanh(arg):
return 1 - 2. / (exp(2*arg) + 1)
return TanH(arg)


def arctanh(arg):
return .5 * (ln(1+arg) - ln(1-arg))
return ArcTanH(arg)


def divide(arg1, arg2):
Expand Down
24 changes: 10 additions & 14 deletions nutils/function.py
Original file line number Diff line number Diff line change
Expand Up @@ -1220,7 +1220,7 @@ def subtract(__left: IntoArray, __right: IntoArray) -> Array:
:class:`Array`
'''

return add(__left, negative(__right))
return _Wrapper.broadcasted_arrays(evaluable.subtract, __left, __right)


@implements(numpy.positive)
Expand Down Expand Up @@ -1252,7 +1252,7 @@ def negative(__arg: IntoArray) -> Array:
:class:`Array`
'''

return multiply(__arg, -1)
return _Wrapper.broadcasted_arrays(evaluable.negative, __arg)


@implements(numpy.multiply)
Expand Down Expand Up @@ -1322,7 +1322,7 @@ def reciprocal(__arg: IntoArray) -> Array:
:class:`Array`
'''

return power(__arg, -1.)
return _Wrapper.broadcasted_arrays(evaluable.reciprocal, __arg)


@implements(numpy.power)
Expand Down Expand Up @@ -1354,7 +1354,7 @@ def sqrt(__arg: IntoArray) -> Array:
:class:`Array`
'''

return power(__arg, .5)
return _Wrapper.broadcasted_arrays(evaluable.sqrt, __arg, min_dtype=float)


@implements(numpy.square)
Expand Down Expand Up @@ -1596,8 +1596,7 @@ def cosh(__arg: IntoArray) -> Array:
:class:`Array`
'''

arg = Array.cast(__arg)
return .5 * (exp(arg) + exp(-arg))
return _Wrapper.broadcasted_arrays(evaluable.cosh, __arg, min_dtype=float)


@implements(numpy.sinh)
Expand All @@ -1613,8 +1612,7 @@ def sinh(__arg: IntoArray) -> Array:
:class:`Array`
'''

arg = Array.cast(__arg)
return .5 * (exp(arg) - exp(-arg))
return _Wrapper.broadcasted_arrays(evaluable.sinh, __arg, min_dtype=float)


@implements(numpy.tanh)
Expand All @@ -1630,8 +1628,7 @@ def tanh(__arg: IntoArray) -> Array:
:class:`Array`
'''

arg = Array.cast(__arg)
return 1 - 2. / (exp(2*arg) + 1)
return _Wrapper.broadcasted_arrays(evaluable.tanh, __arg, min_dtype=float)


@implements(numpy.arctanh)
Expand All @@ -1647,8 +1644,7 @@ def arctanh(__arg: IntoArray) -> Array:
:class:`Array`
'''

arg = Array.cast(__arg)
return .5 * (ln(1+arg) - ln(1-arg))
return _Wrapper.broadcasted_arrays(evaluable.arctanh, __arg, min_dtype=float)


@implements(numpy.exp)
Expand Down Expand Up @@ -1699,7 +1695,7 @@ def log2(__arg: IntoArray) -> Array:
:class:`Array`
'''

return log(__arg) / log(2)
return _Wrapper.broadcasted_arrays(evaluable.log2, __arg, min_dtype=float)


@implements(numpy.log10)
Expand All @@ -1715,7 +1711,7 @@ def log10(__arg: IntoArray) -> Array:
:class:`Array`
'''

return log(__arg) / log(10)
return _Wrapper.broadcasted_arrays(evaluable.log10, __arg, min_dtype=float)

# COMPARISON

Expand Down
2 changes: 2 additions & 0 deletions tests/test_evaluable.py
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,8 @@ def generate(*shape, real, imag, zero, negative):
raise Exception('shape is too small to test at least one of all selected number categories')
if real or imag:
a = numpy.tanh(2 * a / a[-1]) # map to (-1,1)
if negative:
a[:iz] -= a[iz-1] / 2 # introduce asymmetry to reduce risk of singular matrices
if real and imag:
assert negative
a = a * numpy.exp(1j * numpy.arange(size)**2)
Expand Down

0 comments on commit 280e6d7

Please sign in to comment.