"""Export torch work functions for unary ufuncs, rename/tweak to match numpy.
This listing is further exported to public symbols in the `_numpy/_ufuncs.py` module.
"""

import torch

from torch import (  # noqa: F401
    absolute as fabs,  # noqa: F401
    arccos,  # noqa: F401
    arccosh,  # noqa: F401
    arcsin,  # noqa: F401
    arcsinh,  # noqa: F401
    arctan,  # noqa: F401
    arctanh,  # noqa: F401
    bitwise_not,  # noqa: F401
    bitwise_not as invert,  # noqa: F401
    ceil,  # noqa: F401
    conj_physical as conjugate,  # noqa: F401
    cos,  # noqa: F401
    cosh,  # noqa: F401
    deg2rad,  # noqa: F401
    deg2rad as radians,  # noqa: F401
    exp,  # noqa: F401
    exp2,  # noqa: F401
    expm1,  # noqa: F401
    floor,  # noqa: F401
    isfinite,  # noqa: F401
    isinf,  # noqa: F401
    isnan,  # noqa: F401
    log,  # noqa: F401
    log10,  # noqa: F401
    log1p,  # noqa: F401
    log2,  # noqa: F401
    logical_not,  # noqa: F401
    negative,  # noqa: F401
    rad2deg,  # noqa: F401
    rad2deg as degrees,  # noqa: F401
    reciprocal,  # noqa: F401
    round as fix,  # noqa: F401
    round as rint,  # noqa: F401
    sign,  # noqa: F401
    signbit,  # noqa: F401
    sin,  # noqa: F401
    sinh,  # noqa: F401
    sqrt,  # noqa: F401
    square,  # noqa: F401
    tan,  # noqa: F401
    tanh,  # noqa: F401
    trunc,  # noqa: F401
)


# special cases: torch does not export these names
def cbrt(x):
    return torch.pow(x, 1 / 3)


def positive(x):
    return +x


def absolute(x):
    # work around torch.absolute not impl for bools
    if x.dtype == torch.bool:
        return x
    return torch.absolute(x)


# TODO set __name__ and __qualname__
abs = absolute
conj = conjugate
