def test11_hyp(): for i in range(-5, 5): for j in range(-5, 5): a = ek.sinh(C(i, j)) b = C(cmath.sinh(complex(i, j))) assert ek.allclose(a, b) a = ek.cosh(C(i, j)) b = C(cmath.cosh(complex(i, j))) assert ek.allclose(a, b) sa, ca = ek.sincosh(C(i, j)) sb = C(cmath.sinh(complex(i, j))) cb = C(cmath.cosh(complex(i, j))) assert ek.allclose(sa, sb) assert ek.allclose(ca, cb) # Python appears to handle the branch cuts # differently from Enoki, C, and Mathematica.. a = ek.asinh(C(i + 0.1, j)) b = C(cmath.asinh(complex(i + 0.1, j))) assert ek.allclose(a, b) a = ek.acosh(C(i, j)) b = C(cmath.acosh(complex(i, j))) assert ek.allclose(a, b, atol=1e-7) if abs(i) != 1 or j != 0: a = ek.atanh(C(i, j)) b = C(cmath.atanh(complex(i, j))) assert ek.allclose(a, b, atol=1e-7)
def atanh_(a0): if not a0.IsFloat: raise Exception("atanh(): requires floating point operands!") ar, sr = _check1(a0) if not a0.IsSpecial: for i in range(sr): ar[i] = _ek.atanh(a0[i]) elif a0.IsComplex: return _ek.log((1 + a0) / (1 - a0)) * .5 else: raise Exception("atanh(): unsupported array type!") return ar
def test39_atanh(m): x = ek.linspace(m.Float, -.99, .99, 10) ek.enable_grad(x) y = ek.atanh(x) ek.backward(y) assert ek.allclose( y, m.Float(-2.64665, -1.02033, -0.618381, -0.342828, -0.110447, 0.110447, 0.342828, 0.618381, 1.02033, 2.64665)) assert ek.allclose( ek.grad(x), m.Float(50.2513, 2.4564, 1.43369, 1.12221, 1.01225, 1.01225, 1.12221, 1.43369, 2.4564, 50.2513))