Example #1
0
defvjp(
    np.fabs, lambda ans, x: lambda g: np.sign(x) * g
)  # fabs doesn't take complex numbers.
defvjp(np.absolute, lambda ans, x: lambda g: g * np.conj(x) / ans)
defvjp(np.reciprocal, lambda ans, x: lambda g: -g / x ** 2)
defvjp(np.exp, lambda ans, x: lambda g: ans * g)
defvjp(np.exp2, lambda ans, x: lambda g: ans * np.log(2) * g)
defvjp(np.expm1, lambda ans, x: lambda g: (ans + 1) * g)
defvjp(np.log, lambda ans, x: lambda g: g / x)
defvjp(np.log2, lambda ans, x: lambda g: g / x / np.log(2))
defvjp(np.log10, lambda ans, x: lambda g: g / x / np.log(10))
defvjp(np.log1p, lambda ans, x: lambda g: g / (x + 1))
defvjp(np.sin, lambda ans, x: lambda g: g * np.cos(x))
defvjp(np.cos, lambda ans, x: lambda g: -g * np.sin(x))
defvjp(np.tan, lambda ans, x: lambda g: g / np.cos(x) ** 2)
defvjp(np.arcsin, lambda ans, x: lambda g: g / np.sqrt(1 - x ** 2))
defvjp(np.arccos, lambda ans, x: lambda g: -g / np.sqrt(1 - x ** 2))
defvjp(np.arctan, lambda ans, x: lambda g: g / (1 + x ** 2))
defvjp(np.sinh, lambda ans, x: lambda g: g * np.cosh(x))
defvjp(np.cosh, lambda ans, x: lambda g: g * np.sinh(x))
defvjp(np.tanh, lambda ans, x: lambda g: g / np.cosh(x) ** 2)
defvjp(np.arcsinh, lambda ans, x: lambda g: g / np.sqrt(x ** 2 + 1))
defvjp(np.arccosh, lambda ans, x: lambda g: g / np.sqrt(x ** 2 - 1))
defvjp(np.arctanh, lambda ans, x: lambda g: g / (1 - x ** 2))
defvjp(np.rad2deg, lambda ans, x: lambda g: g / np.pi * 180.0)
defvjp(np.degrees, lambda ans, x: lambda g: g / np.pi * 180.0)
defvjp(np.deg2rad, lambda ans, x: lambda g: g * np.pi / 180.0)
defvjp(np.radians, lambda ans, x: lambda g: g * np.pi / 180.0)
defvjp(np.square, lambda ans, x: lambda g: g * 2 * x)
defvjp(np.sqrt, lambda ans, x: lambda g: g * 0.5 * x ** -0.5)
defvjp(
Example #2
0
register_diff(np.subtract, lambda x1, x2: x1[1] - x2[1])
register_diff(np.multiply, multiply_diff)
register_diff(np.matmul, matmul_diff)
register_diff(np.divide, divide_diff)
register_diff(np.true_divide, divide_diff)
register_diff(np.power, pow_diff)
register_diff(np.positive, lambda x: +x[1])
register_diff(np.negative, lambda x: -x[1])
register_diff(np.conj, lambda x: np.conj(x[1]))
register_diff(np.conj, lambda x: np.conj(x[1]))
register_diff(np.exp, lambda x: x[1] * np.exp(x[0]))
register_diff(np.exp2, lambda x: x[1] * np.log(2) * np.exp(x[0]))
register_diff(np.log, lambda x: x[1] / x[0])
register_diff(np.log2, lambda x: x[1] / (np.log(2) * x[0]))
register_diff(np.log10, lambda x: x[1] / (np.log(10) * x[0]))
register_diff(np.sqrt, lambda x: x[1] / (2 * np.sqrt(x[0])))
register_diff(np.square, lambda x: 2 * x[1] * x[0])
register_diff(np.cbrt, lambda x: x[1] / (3 * (x[0]**(2 / 3))))
register_diff(np.reciprocal, lambda x: -x[1] / np.square(x[0]))
register_diff(np.broadcast_to, lambda x, shape: np.broadcast_to(x[1], shape))

register_diff(np.sin, lambda x: x[1] * np.cos(x[0]))
register_diff(np.cos, lambda x: -x[1] * np.sin(x[0]))
register_diff(np.tan, lambda x: x[1] / np.square(np.cos(x[0])))
register_diff(np.arcsin, lambda x: x[1] / np.sqrt(1 - np.square(x[0])))
register_diff(np.arccos, lambda x: -x[1] / np.sqrt(1 - np.square(x[0])))
register_diff(np.arctan, lambda x: x[1] / (1 + np.square(x[0])))
register_diff(np.arctan2, arctan2_diff)

register_diff(np.sinh, lambda x: x[1] * np.cosh(x[0]))
register_diff(np.cosh, lambda x: x[1] * np.sinh(x[0]))
Example #3
0
            * sin(x)**2,
            (0, pi),
        ),
        (
            lambda x: np.log(x**2),
            lambda x: -2 / x**2,
            (1, None),
        ),
        (
            lambda x: np.power(np.cos(x), 2) * np.log(x),
            lambda x: -2 * cos(2 * x) * log(x) - 2 * sin(2 * x) / x - cos(x)**2
            / x**2,
            (0, None),
        ),
        (
            lambda x: x / np.sqrt(1 - x**2),
            lambda x: 3 * x / (1 - x**2)**(5 / 2),
            (-1, 1),
        ),
    ],
)
def test_high_order_diff(backend, mode, func, y_d, domain):
    if domain is None:
        x_arr = generate_test_data()
    else:
        x_arr = generate_test_data(a=domain[0], b=domain[1])
    expect_diff = [y_d(xa) for xa in x_arr]
    try:
        with ua.set_backend(udiff.DiffArrayBackend(backend, mode=mode),
                            coerce=True):
            x = np.asarray(x_arr)