28558dca80
Build / Build and test on ubuntu-24.04-arm for aarch64 (push) Waiting to run
Build / Build and test on windows-11-arm for aarch64 (push) Waiting to run
Build / Build and test on macos-latest for x86_64 (push) Waiting to run
Build / Build and test on windows-latest for x86_64 (push) Waiting to run
Build / Build and test on ubuntu-latest for x86_64 (push) Failing after 1s
Build / Build and test on ubuntu-latest (numpy 1.26) for x86_64 (push) Failing after 0s
236 lines
9.3 KiB
C++
236 lines
9.3 KiB
C++
// -*- c-mode -*-
|
|
/*********************************************************************
|
|
Numexpr - Fast numerical array expression evaluator for NumPy.
|
|
|
|
License: MIT
|
|
Author: See AUTHORS.txt
|
|
|
|
See LICENSE.txt for details about copyright and rights to use.
|
|
**********************************************************************/
|
|
|
|
/* These #if blocks make it easier to query this file, without having
|
|
to define every row function before #including it. */
|
|
#ifndef FUNC_FF
|
|
#define ELIDE_FUNC_FF
|
|
#define FUNC_FF(...)
|
|
#endif
|
|
FUNC_FF(FUNC_SQRT_FF, "sqrt_ff", sqrtf, sqrtf2, vsSqrt)
|
|
FUNC_FF(FUNC_SIN_FF, "sin_ff", sinf, sinf2, vsSin)
|
|
FUNC_FF(FUNC_COS_FF, "cos_ff", cosf, cosf2, vsCos)
|
|
FUNC_FF(FUNC_TAN_FF, "tan_ff", tanf, tanf2, vsTan)
|
|
FUNC_FF(FUNC_ARCSIN_FF, "arcsin_ff", asinf, asinf2, vsAsin)
|
|
FUNC_FF(FUNC_ARCCOS_FF, "arccos_ff", acosf, acosf2, vsAcos)
|
|
FUNC_FF(FUNC_ARCTAN_FF, "arctan_ff", atanf, atanf2, vsAtan)
|
|
FUNC_FF(FUNC_SINH_FF, "sinh_ff", sinhf, sinhf2, vsSinh)
|
|
FUNC_FF(FUNC_COSH_FF, "cosh_ff", coshf, coshf2, vsCosh)
|
|
FUNC_FF(FUNC_TANH_FF, "tanh_ff", tanhf, tanhf2, vsTanh)
|
|
FUNC_FF(FUNC_ARCSINH_FF, "arcsinh_ff", asinhf, asinhf2, vsAsinh)
|
|
FUNC_FF(FUNC_ARCCOSH_FF, "arccosh_ff", acoshf, acoshf2, vsAcosh)
|
|
FUNC_FF(FUNC_ARCTANH_FF, "arctanh_ff", atanhf, atanhf2, vsAtanh)
|
|
FUNC_FF(FUNC_LOG_FF, "log_ff", logf, logf2, vsLn)
|
|
FUNC_FF(FUNC_LOG1P_FF, "log1p_ff", log1pf, log1pf2, vsLog1p)
|
|
FUNC_FF(FUNC_LOG10_FF, "log10_ff", log10f, log10f2, vsLog10)
|
|
FUNC_FF(FUNC_LOG2_FF, "log2_ff", log2f, log2f2, vsLog2)
|
|
FUNC_FF(FUNC_EXP_FF, "exp_ff", expf, expf2, vsExp)
|
|
FUNC_FF(FUNC_EXPM1_FF, "expm1_ff", expm1f, expm1f2, vsExpm1)
|
|
FUNC_FF(FUNC_ABS_FF, "absolute_ff", fabsf, fabsf2, vsAbs)
|
|
FUNC_FF(FUNC_CONJ_FF, "conjugate_ff",fconjf, fconjf2, vsConj)
|
|
FUNC_FF(FUNC_CEIL_FF, "ceil_ff", ceilf, ceilf2, vsCeil)
|
|
FUNC_FF(FUNC_FLOOR_FF, "floor_ff", floorf, floorf2, vsFloor)
|
|
FUNC_FF(FUNC_TRUNC_FF, "trunc_ff", truncf, truncf2, vsTrunc)
|
|
FUNC_FF(FUNC_SIGN_FF, "sign_ff", signf, signf2, vsSign)
|
|
//rint rounds to nearest even integer, matching NumPy (round doesn't)
|
|
FUNC_FF(FUNC_ROUND_FF, "round_ff", rintf, rintf2, vsRint)
|
|
FUNC_FF(FUNC_FF_LAST, NULL, NULL, NULL, NULL)
|
|
#ifdef ELIDE_FUNC_FF
|
|
#undef ELIDE_FUNC_FF
|
|
#undef FUNC_FF
|
|
#endif
|
|
|
|
#ifndef FUNC_FFF
|
|
#define ELIDE_FUNC_FFF
|
|
#define FUNC_FFF(...)
|
|
#endif
|
|
FUNC_FFF(FUNC_FMOD_FFF, "fmod_fff", fmodf, fmodf2, vsfmod)
|
|
FUNC_FFF(FUNC_ARCTAN2_FFF, "arctan2_fff", atan2f, atan2f2, vsAtan2)
|
|
FUNC_FFF(FUNC_HYPOT_FFF, "hypot_fff", hypotf, hypotf2, vsHypot)
|
|
FUNC_FFF(FUNC_NEXTAFTER_FFF, "nextafter_fff", nextafterf, nextafterf2, vsNextAfter)
|
|
FUNC_FFF(FUNC_COPYSIGN_FFF, "copysign_fff", copysignf, copysignf2, vsCopySign)
|
|
FUNC_FFF(FUNC_MAXIMUM_FFF, "maximum_fff", fmaxf_, fmaxf2, vsFmax_)
|
|
FUNC_FFF(FUNC_MINIMUM_FFF, "minimum_fff", fminf_, fminf2, vsFmin_)
|
|
FUNC_FFF(FUNC_FFF_LAST, NULL, NULL, NULL, NULL)
|
|
#ifdef ELIDE_FUNC_FFF
|
|
#undef ELIDE_FUNC_FFF
|
|
#undef FUNC_FFF
|
|
#endif
|
|
|
|
#ifndef FUNC_DD
|
|
#define ELIDE_FUNC_DD
|
|
#define FUNC_DD(...)
|
|
#endif
|
|
FUNC_DD(FUNC_SQRT_DD, "sqrt_dd", sqrt, vdSqrt)
|
|
FUNC_DD(FUNC_SIN_DD, "sin_dd", sin, vdSin)
|
|
FUNC_DD(FUNC_COS_DD, "cos_dd", cos, vdCos)
|
|
FUNC_DD(FUNC_TAN_DD, "tan_dd", tan, vdTan)
|
|
FUNC_DD(FUNC_ARCSIN_DD, "arcsin_dd", asin, vdAsin)
|
|
FUNC_DD(FUNC_ARCCOS_DD, "arccos_dd", acos, vdAcos)
|
|
FUNC_DD(FUNC_ARCTAN_DD, "arctan_dd", atan, vdAtan)
|
|
FUNC_DD(FUNC_SINH_DD, "sinh_dd", sinh, vdSinh)
|
|
FUNC_DD(FUNC_COSH_DD, "cosh_dd", cosh, vdCosh)
|
|
FUNC_DD(FUNC_TANH_DD, "tanh_dd", tanh, vdTanh)
|
|
FUNC_DD(FUNC_ARCSINH_DD, "arcsinh_dd", asinh, vdAsinh)
|
|
FUNC_DD(FUNC_ARCCOSH_DD, "arccosh_dd", acosh, vdAcosh)
|
|
FUNC_DD(FUNC_ARCTANH_DD, "arctanh_dd", atanh, vdAtanh)
|
|
FUNC_DD(FUNC_LOG_DD, "log_dd", log, vdLn)
|
|
FUNC_DD(FUNC_LOG1P_DD, "log1p_dd", log1p, vdLog1p)
|
|
FUNC_DD(FUNC_LOG10_DD, "log10_dd", log10, vdLog10)
|
|
FUNC_DD(FUNC_LOG2_DD, "log2_dd", log2, vdLog2)
|
|
FUNC_DD(FUNC_EXP_DD, "exp_dd", exp, vdExp)
|
|
FUNC_DD(FUNC_EXPM1_DD, "expm1_dd", expm1, vdExpm1)
|
|
FUNC_DD(FUNC_ABS_DD, "absolute_dd", fabs, vdAbs)
|
|
FUNC_DD(FUNC_CONJ_DD, "conjugate_dd",fconj, vdConj)
|
|
FUNC_DD(FUNC_CEIL_DD, "ceil_dd", ceil, vdCeil)
|
|
FUNC_DD(FUNC_FLOOR_DD, "floor_dd", floor, vdFloor)
|
|
FUNC_DD(FUNC_TRUNC_DD, "trunc_dd", trunc, vdTrunc)
|
|
FUNC_DD(FUNC_SIGN_DD, "sign_dd", sign, vdSign)
|
|
//rint rounds to nearest even integer, matching NumPy (round doesn't)
|
|
FUNC_DD(FUNC_ROUND_DD, "round_dd", rint, vdRint)
|
|
FUNC_DD(FUNC_DD_LAST, NULL, NULL, NULL)
|
|
#ifdef ELIDE_FUNC_DD
|
|
#undef ELIDE_FUNC_DD
|
|
#undef FUNC_DD
|
|
#endif
|
|
|
|
// double -> boolean functions
|
|
#ifndef FUNC_BD
|
|
#define ELIDE_FUNC_BD
|
|
#define FUNC_BD(...)
|
|
#endif
|
|
FUNC_BD(FUNC_ISNAN_BD, "isnan_bd", isnand, vdIsnan)
|
|
FUNC_BD(FUNC_ISFINITE_BD, "isfinite_bd", isfinited, vdIsfinite)
|
|
FUNC_BD(FUNC_ISINF_BD, "isinf_bd", isinfd, vdIsinf)
|
|
FUNC_BD(FUNC_SIGNBIT_BD, "signbit_bd", signbit, vdSignBit)
|
|
FUNC_BD(FUNC_BD_LAST, NULL, NULL, NULL)
|
|
#ifdef ELIDE_FUNC_BD
|
|
#undef ELIDE_FUNC_BD
|
|
#undef FUNC_BD
|
|
#endif
|
|
|
|
// float -> boolean functions (C99 defines the same function for all types)
|
|
#ifndef FUNC_BF
|
|
#define ELIDE_FUNC_BF
|
|
#define FUNC_BF(...)
|
|
#endif // use wrappers as there is name collision with isnanf in std
|
|
FUNC_BF(FUNC_ISNAN_BF, "isnan_bf", isnanf_, isnanf2, vsIsnan)
|
|
FUNC_BF(FUNC_ISFINITE_BF, "isfinite_bf", isfinitef_, isfinitef2, vsIsfinite)
|
|
FUNC_BF(FUNC_ISINF_BF, "isinf_bf", isinff_, isinff2, vsIsinf)
|
|
FUNC_BF(FUNC_SIGNBIT_BF, "signbit_bf", signbitf, signbitf2, vsSignBit)
|
|
FUNC_BF(FUNC_BF_LAST, NULL, NULL, NULL, NULL)
|
|
#ifdef ELIDE_FUNC_BF
|
|
#undef ELIDE_FUNC_BF
|
|
#undef FUNC_BF
|
|
#endif
|
|
|
|
#ifndef FUNC_DDD
|
|
#define ELIDE_FUNC_DDD
|
|
#define FUNC_DDD(...)
|
|
#endif
|
|
FUNC_DDD(FUNC_FMOD_DDD, "fmod_ddd", fmod, vdfmod)
|
|
FUNC_DDD(FUNC_ARCTAN2_DDD, "arctan2_ddd", atan2, vdAtan2)
|
|
FUNC_DDD(FUNC_HYPOT_DDD, "hypot_ddd", hypot, vdHypot)
|
|
FUNC_DDD(FUNC_NEXTAFTER_DDD, "nextafter_ddd", nextafter, vdNextAfter)
|
|
FUNC_DDD(FUNC_COPYSIGN_DDD, "copysign_ddd", copysign, vdCopySign)
|
|
FUNC_DDD(FUNC_MAXIMUM_DDD, "maximum_ddd", fmaxd, vdFmax_)
|
|
FUNC_DDD(FUNC_MINIMUM_DDD, "minimum_ddd", fmind, vdFmin_)
|
|
FUNC_DDD(FUNC_DDD_LAST, NULL, NULL, NULL)
|
|
#ifdef ELIDE_FUNC_DDD
|
|
#undef ELIDE_FUNC_DDD
|
|
#undef FUNC_DDD
|
|
#endif
|
|
|
|
#ifndef FUNC_CC
|
|
#define ELIDE_FUNC_CC
|
|
#define FUNC_CC(...)
|
|
#endif
|
|
FUNC_CC(FUNC_SQRT_CC, "sqrt_cc", nc_sqrt, vzSqrt)
|
|
FUNC_CC(FUNC_SIN_CC, "sin_cc", nc_sin, vzSin)
|
|
FUNC_CC(FUNC_COS_CC, "cos_cc", nc_cos, vzCos)
|
|
FUNC_CC(FUNC_TAN_CC, "tan_cc", nc_tan, vzTan)
|
|
FUNC_CC(FUNC_ARCSIN_CC, "arcsin_cc", nc_asin, vzAsin)
|
|
FUNC_CC(FUNC_ARCCOS_CC, "arccos_cc", nc_acos, vzAcos)
|
|
FUNC_CC(FUNC_ARCTAN_CC, "arctan_cc", nc_atan, vzAtan)
|
|
FUNC_CC(FUNC_SINH_CC, "sinh_cc", nc_sinh, vzSinh)
|
|
FUNC_CC(FUNC_COSH_CC, "cosh_cc", nc_cosh, vzCosh)
|
|
FUNC_CC(FUNC_TANH_CC, "tanh_cc", nc_tanh, vzTanh)
|
|
FUNC_CC(FUNC_ARCSINH_CC, "arcsinh_cc", nc_asinh, vzAsinh)
|
|
FUNC_CC(FUNC_ARCCOSH_CC, "arccosh_cc", nc_acosh, vzAcosh)
|
|
FUNC_CC(FUNC_ARCTANH_CC, "arctanh_cc", nc_atanh, vzAtanh)
|
|
FUNC_CC(FUNC_LOG_CC, "log_cc", nc_log, vzLn)
|
|
FUNC_CC(FUNC_LOG1P_CC, "log1p_cc", nc_log1p, vzLog1p)
|
|
FUNC_CC(FUNC_LOG10_CC, "log10_cc", nc_log10, vzLog10)
|
|
FUNC_CC(FUNC_LOG2_CC, "log2_cc", nc_log2, vzLog2)
|
|
FUNC_CC(FUNC_EXP_CC, "exp_cc", nc_exp, vzExp)
|
|
FUNC_CC(FUNC_EXPM1_CC, "expm1_cc", nc_expm1, vzExpm1)
|
|
FUNC_CC(FUNC_ABS_CC, "absolute_cc", nc_abs, vzAbs_)
|
|
FUNC_CC(FUNC_CONJ_CC, "conjugate_cc",nc_conj, vzConj)
|
|
FUNC_CC(FUNC_SIGN_CC, "sign_cc", nc_sign, vzSign)
|
|
// rint rounds to nearest even integer, matches NumPy behaviour (round doesn't)
|
|
FUNC_CC(FUNC_ROUND_CC, "round_cc", nc_rint, vzRint)
|
|
FUNC_CC(FUNC_CC_LAST, NULL, NULL, NULL)
|
|
#ifdef ELIDE_FUNC_CC
|
|
#undef ELIDE_FUNC_CC
|
|
#undef FUNC_CC
|
|
#endif
|
|
|
|
#ifndef FUNC_CCC
|
|
#define ELIDE_FUNC_CCC
|
|
#define FUNC_CCC(...)
|
|
#endif
|
|
FUNC_CCC(FUNC_POW_CCC, "pow_ccc", nc_pow)
|
|
FUNC_CCC(FUNC_CCC_LAST, NULL, NULL)
|
|
#ifdef ELIDE_FUNC_CCC
|
|
#undef ELIDE_FUNC_CCC
|
|
#undef FUNC_CCC
|
|
#endif
|
|
|
|
// complex -> boolean functions
|
|
#ifndef FUNC_BC
|
|
#define ELIDE_FUNC_BC
|
|
#define FUNC_BC(...)
|
|
#endif // use wrappers as there is name collision with isnanf in std
|
|
FUNC_BC(FUNC_ISNAN_BC, "isnan_bc", nc_isnan, vzIsnan)
|
|
FUNC_BC(FUNC_ISFINITE_BC, "isfinite_bc", nc_isfinite, vzIsfinite)
|
|
FUNC_BC(FUNC_ISINF_BC, "isinf_bc", nc_isinf, vzIsinf)
|
|
FUNC_BC(FUNC_BC_LAST, NULL, NULL, NULL)
|
|
#ifdef ELIDE_FUNC_BC
|
|
#undef ELIDE_FUNC_BC
|
|
#undef FUNC_BC
|
|
#endif
|
|
|
|
// int -> int functions
|
|
#ifndef FUNC_II
|
|
#define ELIDE_FUNC_II
|
|
#define FUNC_II(...)
|
|
#endif
|
|
FUNC_II(FUNC_SIGN_II, "sign_ii", signi, viSign)
|
|
FUNC_II(FUNC_ROUND_II, "round_ii", rinti, viRint)
|
|
FUNC_II(FUNC_ABS_II, "absolute_ii", fabsi, viFabs)
|
|
FUNC_II(FUNC_II_LAST, NULL, NULL, NULL)
|
|
#ifdef ELIDE_FUNC_II
|
|
#undef ELIDE_FUNC_II
|
|
#undef FUNC_II
|
|
#endif
|
|
|
|
#ifndef FUNC_LL
|
|
#define ELIDE_FUNC_LL
|
|
#define FUNC_LL(...)
|
|
#endif
|
|
FUNC_LL(FUNC_SIGN_LL, "sign_ll", signl, vlSign)
|
|
FUNC_LL(FUNC_ROUND_LL, "round_ll", rintl, vlRint)
|
|
FUNC_LL(FUNC_ABS_LL, "absolute_ll", fabsl, vlFabs)
|
|
FUNC_LL(FUNC_LL_LAST, NULL, NULL, NULL)
|
|
#ifdef ELIDE_FUNC_LL
|
|
#undef ELIDE_FUNC_LL
|
|
#undef FUNC_LL
|
|
#endif
|