# SWIFT_ENABLE_TENSORFLOW
# These changes were part of `ElementaryFunctions`, which was removed from
# apple/swift master branch and moved to apple/swift-numerics.
# TF-1203 tracks eliminating these ad-hoc tensorflow branch changes.


class SwiftMathFunction(object):
    def __init__(self, name, kind=None, swiftName=None, args="x", comment=None,
                 platforms=None):
        self.name = name
        self.swiftName = swiftName if swiftName is not None else name
        self.kind = kind if kind is not None else "library"
        self.args = args
        if comment is not None:
            self.comment = comment
        else:
            self.comment = "/// The " + str(self.swiftName) + " function."
        self.platforms = platforms

    def params(self, prefix="", suffix=""):
        return ", ".join(map(lambda a: prefix + a + suffix, self.args))

    def decl(self, type):
        return self.swiftName + "(" + self.params("_ ", ": " + type) + \
            ") -> " + type

    def freeDecl(self, constraint):
        return self.swiftName + "<T>(" + self.params("_ ", ": T") + \
            ") -> T where " + constraint

    def impl(self, type):
        if self.kind == "intrinsic":
            builtin = "Builtin.int_" + self.name + "_FPIEEE" + str(type.bits)
            return type.stdlib_name + "(" + builtin + "(" + \
                self.params("", "._value") + "))"
        return "_stdlib_" + self.name + type.cFuncSuffix + "(" + \
            self.params() + ")"


ElementaryFunctions = [
    SwiftMathFunction(name="sqrt", kind="intrinsic", comment="""
  /// The square root of `x`.
  ///
  /// For real types, if the argument is negative, either the result is NaN
  /// or a precondition failure occurs. For complex types, this function has
  /// a branch cut along the negative real axis.
"""),
    SwiftMathFunction(name="cos", kind="intrinsic", comment="""
  /// The cosine of `x`.
  ///
  /// For real types, `x` is interpreted as an angle measured in radians.
"""),
    SwiftMathFunction(name="sin", kind="intrinsic", comment="""
  /// The sine of `x`.
  ///
  /// For real types, `x` is interpreted as an angle measured in radians.
"""),
    SwiftMathFunction(name="tan",
                      comment="/// The tangent of `x`."),
    SwiftMathFunction(name="acos"),
    SwiftMathFunction(name="asin"),
    SwiftMathFunction(name="atan"),
    SwiftMathFunction(name="cosh"),
    SwiftMathFunction(name="sinh"),
    SwiftMathFunction(name="tanh"),
    SwiftMathFunction(name="acosh"),
    SwiftMathFunction(name="asinh"),
    SwiftMathFunction(name="atanh"),
    SwiftMathFunction(name="exp", kind="intrinsic"),
    SwiftMathFunction(name="exp2", kind="intrinsic"),
    SwiftMathFunction(name="exp10"),
    SwiftMathFunction(name="expm1"),
    SwiftMathFunction(name="log", kind="intrinsic"),
    SwiftMathFunction(name="log2", kind="intrinsic"),
    SwiftMathFunction(name="log10", kind="intrinsic"),
    SwiftMathFunction(name="log1p"),
    # SwiftMathFunction(name="pow", kind="intrinsic", args="xy"), Handled
    # separately for edge cases.
    # SwiftMathFunction(name="root", args="xn"), Handled separately for
    # implementation.
]

RealFunctions = [
    # SwiftMathFunction(name="atan2"), Handled separately for explicit
    # argument labels.
    SwiftMathFunction(name="erf"),
    SwiftMathFunction(name="erfc"),
    SwiftMathFunction(name="hypot", args="xy"),
    SwiftMathFunction(name="tgamma", swiftName="gamma"),
    # SwiftMathFunction(name="lgamma"), Handled separately for sign result.
]
