#include "math_ir.h" #include extern const char TagRoundingMode[] = "MathRoundingMode"; using TTaggedRoundingMode = NYql::NUdf::TTagged; #define MATH_UDF_MAP(XX, XXL) \ XX(Pi, double(), 0) \ XX(E, double(), 0) \ XX(Eps, double(), 0) \ XX(RoundDownward, TTaggedRoundingMode(), 0) \ XX(RoundToNearest, TTaggedRoundingMode(), 0) \ XX(RoundTowardZero, TTaggedRoundingMode(), 0) \ XX(RoundUpward, TTaggedRoundingMode(), 0) \ XX(Abs, double(TAutoMap), 0) \ XX(Acos, double(TAutoMap), 0) \ XX(Asin, double(TAutoMap), 0) \ XX(Asinh, double(TAutoMap), 0) \ XX(Atan, double(TAutoMap), 0) \ XX(Cbrt, double(TAutoMap), 0) \ XX(Ceil, double(TAutoMap), 0) \ XX(Cos, double(TAutoMap), 0) \ XX(Cosh, double(TAutoMap), 0) \ XX(Erf, double(TAutoMap), 0) \ XX(ErfInv, double(TAutoMap), 0) \ XX(ErfcInv, double(TAutoMap), 0) \ XX(Exp, double(TAutoMap), 0) \ XX(Exp2, double(TAutoMap), 0) \ XX(Fabs, double(TAutoMap), 0) \ XX(Floor, double(TAutoMap), 0) \ XX(Lgamma, double(TAutoMap), 0) \ XX(Rint, double(TAutoMap), 0) \ XX(Sin, double(TAutoMap), 0) \ XX(Sinh, double(TAutoMap), 0) \ XX(Sqrt, double(TAutoMap), 0) \ XX(Tan, double(TAutoMap), 0) \ XX(Tanh, double(TAutoMap), 0) \ XX(Tgamma, double(TAutoMap), 0) \ XX(Trunc, double(TAutoMap), 0) \ XX(Log, double(TAutoMap), 0) \ XX(Log2, double(TAutoMap), 0) \ XX(Log10, double(TAutoMap), 0) \ XX(Atan2, double(TAutoMap, TAutoMap), 0) \ XX(Fmod, double(TAutoMap, TAutoMap), 0) \ XX(Hypot, double(TAutoMap, TAutoMap), 0) \ XX(Remainder, double(TAutoMap, TAutoMap), 0) \ XX(Pow, double(TAutoMap, TAutoMap), 0) \ XX(Ldexp, double(TAutoMap, TAutoMap), 0) \ XX(IsFinite, bool(TAutoMap), 0) \ XX(IsInf, bool(TAutoMap), 0) \ XX(IsNaN, bool(TAutoMap), 0) \ XX(Sigmoid, double(TAutoMap), 0) \ XX(FuzzyEquals, bool(TAutoMap, TAutoMap, TEpsilon), 1) \ XX(Mod, TOptional(TAutoMap, i64), 0) \ XX(Rem, TOptional(TAutoMap, i64), 0) \ XXL(Round, double(TAutoMap, TPrecision), 1) #define MATH_UDF_MAP_WITHOUT_IR(XX) \ XX(NearbyInt, TOptional(TAutoMap, TTaggedRoundingMode), 0) #ifdef DISABLE_IR #define MATH_STRICT_UDF(name, signature, optionalArgsCount) \ SIMPLE_STRICT_UDF_WITH_OPTIONAL_ARGS(T##name, signature, optionalArgsCount) { \ TUnboxedValuePod res; \ name##IR(this, &res, valueBuilder, args); \ return res; \ } #else #define MATH_STRICT_UDF(name, signature, optionalArgsCount) \ SIMPLE_STRICT_UDF_WITH_IR(T##name, signature, optionalArgsCount, "/llvm_bc/Math", #name "IR") { \ TUnboxedValuePod res; \ name##IR(this, &res, valueBuilder, args); \ return res; \ } #endif #define MATH_STRICT_UDF_WITHOUT_IR(name, signature, optionalArgsCount) \ SIMPLE_STRICT_UDF_WITH_OPTIONAL_ARGS(T##name, signature, optionalArgsCount) { \ TUnboxedValuePod res; \ name##IR(this, &res, valueBuilder, args); \ return res; \ } #define REGISTER_MATH_UDF(udfName, ...) T##udfName, #define REGISTER_MATH_UDF_LAST(udfName, ...) T##udfName using namespace NKikimr; using namespace NUdf; namespace { extern const char epsilon[] = "Epsilon"; using TEpsilon = TNamedArg; extern const char precision[] = "Precision"; using TPrecision = TNamedArg; MATH_UDF_MAP(MATH_STRICT_UDF, MATH_STRICT_UDF) MATH_UDF_MAP_WITHOUT_IR(MATH_STRICT_UDF_WITHOUT_IR) SIMPLE_MODULE(TMathModule, MATH_UDF_MAP_WITHOUT_IR(REGISTER_MATH_UDF) MATH_UDF_MAP(REGISTER_MATH_UDF, REGISTER_MATH_UDF_LAST)) } REGISTER_MODULES(TMathModule)