32 #ifndef VSMC_MATH_VMATH_HPP
33 #define VSMC_MATH_VMATH_HPP
41 #elif VSMC_USE_VECLIB_VFORCE
42 #include <Accelerate/Accelerate.h>
56 #ifndef VSMC_VMATH_THRESHOLD
57 #define VSMC_VMATH_THRESHOLD 1000
60 #ifndef VSMC_VMATH_THRESHOLD_Add
61 #define VSMC_VMATH_THRESHOLD_Add VSMC_VMATH_THRESHOLD
64 #ifndef VSMC_VMATH_THRESHOLD_Sub
65 #define VSMC_VMATH_THRESHOLD_Sub VSMC_VMATH_THRESHOLD
68 #ifndef VSMC_VMATH_THRESHOLD_Sqr
69 #define VSMC_VMATH_THRESHOLD_Sqr VSMC_VMATH_THRESHOLD
72 #ifndef VSMC_VMATH_THRESHOLD_Mul
73 #define VSMC_VMATH_THRESHOLD_Mul VSMC_VMATH_THRESHOLD
76 #ifndef VSMC_VMATH_THRESHOLD_Abs
77 #define VSMC_VMATH_THRESHOLD_Abs VSMC_VMATH_THRESHOLD
80 #ifndef VSMC_VMATH_THRESHOLD_LinearFrac
81 #define VSMC_VMATH_THRESHOLD_LinearFrac VSMC_VMATH_THRESHOLD
84 #ifndef VSMC_VMATH_THRESHOLD_Inv
85 #define VSMC_VMATH_THRESHOLD_Inv VSMC_VMATH_THRESHOLD
88 #ifndef VSMC_VMATH_THRESHOLD_Div
89 #define VSMC_VMATH_THRESHOLD_Div VSMC_VMATH_THRESHOLD
92 #ifndef VSMC_VMATH_THRESHOLD_Sqrt
93 #define VSMC_VMATH_THRESHOLD_Sqrt VSMC_VMATH_THRESHOLD
96 #ifndef VSMC_VMATH_THRESHOLD_InvSqrt
97 #define VSMC_VMATH_THRESHOLD_InvSqrt VSMC_VMATH_THRESHOLD
100 #ifndef VSMC_VMATH_THRESHOLD_Cbrt
101 #define VSMC_VMATH_THRESHOLD_Cbrt VSMC_VMATH_THRESHOLD
104 #ifndef VSMC_VMATH_THRESHOLD_InvCbrt
105 #define VSMC_VMATH_THRESHOLD_InvCbrt VSMC_VMATH_THRESHOLD
108 #ifndef VSMC_VMATH_THRESHOLD_Pow2o3
109 #define VSMC_VMATH_THRESHOLD_Pow2o3 VSMC_VMATH_THRESHOLD
112 #ifndef VSMC_VMATH_THRESHOLD_Pow3o2
113 #define VSMC_VMATH_THRESHOLD_Pow3o2 VSMC_VMATH_THRESHOLD
116 #ifndef VSMC_VMATH_THRESHOLD_Pow
117 #define VSMC_VMATH_THRESHOLD_Pow VSMC_VMATH_THRESHOLD
120 #ifndef VSMC_VMATH_THRESHOLD_Powx
121 #define VSMC_VMATH_THRESHOLD_Powx VSMC_VMATH_THRESHOLD
124 #ifndef VSMC_VMATH_THRESHOLD_Hypot
125 #define VSMC_VMATH_THRESHOLD_Hypot VSMC_VMATH_THRESHOLD
128 #ifndef VSMC_VMATH_THRESHOLD_Exp
129 #define VSMC_VMATH_THRESHOLD_Exp VSMC_VMATH_THRESHOLD
132 #ifndef VSMC_VMATH_THRESHOLD_Expm1
133 #define VSMC_VMATH_THRESHOLD_Expm1 VSMC_VMATH_THRESHOLD
136 #ifndef VSMC_VMATH_THRESHOLD_Ln
137 #define VSMC_VMATH_THRESHOLD_Ln VSMC_VMATH_THRESHOLD
140 #ifndef VSMC_VMATH_THRESHOLD_Log10
141 #define VSMC_VMATH_THRESHOLD_Log10 VSMC_VMATH_THRESHOLD
144 #ifndef VSMC_VMATH_THRESHOLD_Log1p
145 #define VSMC_VMATH_THRESHOLD_Log1p VSMC_VMATH_THRESHOLD
148 #ifndef VSMC_VMATH_THRESHOLD_Cos
149 #define VSMC_VMATH_THRESHOLD_Cos VSMC_VMATH_THRESHOLD
152 #ifndef VSMC_VMATH_THRESHOLD_Sin
153 #define VSMC_VMATH_THRESHOLD_Sin VSMC_VMATH_THRESHOLD
156 #ifndef VSMC_VMATH_THRESHOLD_SinCos
157 #define VSMC_VMATH_THRESHOLD_SinCos VSMC_VMATH_THRESHOLD
160 #ifndef VSMC_VMATH_THRESHOLD_Tan
161 #define VSMC_VMATH_THRESHOLD_Tan VSMC_VMATH_THRESHOLD
164 #ifndef VSMC_VMATH_THRESHOLD_Acos
165 #define VSMC_VMATH_THRESHOLD_Acos VSMC_VMATH_THRESHOLD
168 #ifndef VSMC_VMATH_THRESHOLD_Asin
169 #define VSMC_VMATH_THRESHOLD_Asin VSMC_VMATH_THRESHOLD
172 #ifndef VSMC_VMATH_THRESHOLD_Atan
173 #define VSMC_VMATH_THRESHOLD_Atan VSMC_VMATH_THRESHOLD
176 #ifndef VSMC_VMATH_THRESHOLD_Atan2
177 #define VSMC_VMATH_THRESHOLD_Atan2 VSMC_VMATH_THRESHOLD
180 #ifndef VSMC_VMATH_THRESHOLD_Cosh
181 #define VSMC_VMATH_THRESHOLD_Cosh VSMC_VMATH_THRESHOLD
184 #ifndef VSMC_VMATH_THRESHOLD_Sinh
185 #define VSMC_VMATH_THRESHOLD_Sinh VSMC_VMATH_THRESHOLD
188 #ifndef VSMC_VMATH_THRESHOLD_Tanh
189 #define VSMC_VMATH_THRESHOLD_Tanh VSMC_VMATH_THRESHOLD
192 #ifndef VSMC_VMATH_THRESHOLD_Acosh
193 #define VSMC_VMATH_THRESHOLD_Acosh VSMC_VMATH_THRESHOLD
196 #ifndef VSMC_VMATH_THRESHOLD_Asinh
197 #define VSMC_VMATH_THRESHOLD_Asinh VSMC_VMATH_THRESHOLD
200 #ifndef VSMC_VMATH_THRESHOLD_Atanh
201 #define VSMC_VMATH_THRESHOLD_Atanh VSMC_VMATH_THRESHOLD
204 #ifndef VSMC_VMATH_THRESHOLD_Erf
205 #define VSMC_VMATH_THRESHOLD_Erf VSMC_VMATH_THRESHOLD
208 #ifndef VSMC_VMATH_THRESHOLD_Erfc
209 #define VSMC_VMATH_THRESHOLD_Erfc VSMC_VMATH_THRESHOLD
212 #ifndef VSMC_VMATH_THRESHOLD_CdfNorm
213 #define VSMC_VMATH_THRESHOLD_CdfNorm VSMC_VMATH_THRESHOLD
216 #ifndef VSMC_VMATH_THRESHOLD_ErfInv
217 #define VSMC_VMATH_THRESHOLD_ErfInv VSMC_VMATH_THRESHOLD
220 #ifndef VSMC_VMATH_THRESHOLD_ErfcInv
221 #define VSMC_VMATH_THRESHOLD_ErfcInv VSMC_VMATH_THRESHOLD
224 #ifndef VSMC_VMATH_THRESHOLD_CdfNormInv
225 #define VSMC_VMATH_THRESHOLD_CdfNormInv VSMC_VMATH_THRESHOLD
228 #ifndef VSMC_VMATH_THRESHOLD_LGamma
229 #define VSMC_VMATH_THRESHOLD_LGamma VSMC_VMATH_THRESHOLD
232 #ifndef VSMC_VMATH_THRESHOLD_TGamma
233 #define VSMC_VMATH_THRESHOLD_TGamma VSMC_VMATH_THRESHOLD
236 #define VSMC_DEFINE_MATH_VMATH_1(ns, func, name) \
237 template <typename T> \
238 inline void v##name (std::size_t n, const T *a, T *y) \
241 for (std::size_t i = 0; i != n; ++i) \
245 #define VSMC_DEFINE_MATH_VMATH_2(ns, func, name) \
246 template <typename T> \
247 inline void v##name (std::size_t n, const T *a, const T *b, T *y) \
250 for (std::size_t i = 0; i != n; ++i) \
251 y[i] = func(a[i], b[i]); \
254 #define VSMC_DEFINE_MATH_VMATH_B(op, vname) \
255 template <typename T> \
256 inline void v##vname (std::size_t n, const T *a, const T *b, T *y) \
258 for (std::size_t i = 0; i != n; ++i) \
259 y[i] = a[i] op b[i]; \
268 template <
typename T>
272 template <
typename T>
274 {
return static_cast<T
>(1) / a;}
276 template <
typename T>
278 {
using std::sqrt;
return static_cast<T
>(1) / sqrt(a);}
280 template <
typename T>
282 {
using cxx11::cbrt;
return static_cast<T
>(1) / cbrt(a);}
284 template <
typename T>
286 {
using cxx11::cbrt; a = cbrt(a);
return a * a;}
288 template <
typename T>
290 {
using std::sqrt; a = sqrt(a);
return a * a * a;}
292 template <
typename T>
296 return static_cast<T
>(0.5) +
static_cast<T
>(0.5) * erf(
300 template <
typename T>
302 {
using cxx11::erf;
return static_cast<T
>(1) / erf(a);}
304 template <
typename T>
308 template <
typename T>
328 VSMC_DEFINE_MATH_VMATH_B(*, Mul)
335 template <typename T>
337 T beta_a, T beta_b, T mu_a, T mu_b, T *y)
339 for (std::size_t i = 0; i != n; ++i)
340 y[i] = beta_a * a[i] + mu_a;
341 for (std::size_t i = 0; i != n; ++i)
342 y[i] /= beta_b * b[i] + mu_b;
379 template <typename T>
380 inline
void vPowx (std::
size_t n, const T *a, T b, T *y)
383 for (std::size_t i = 0; i != n; ++i)
424 template <typename T>
425 inline
void vSinCos (std::
size_t n, const T *a, T *y, T *z)
429 for (std::size_t i = 0; i != n; ++i)
431 for (std::size_t i = 0; i != n; ++i)
519 #define VSMC_DEFINE_MATH_VMATH_VML_1(name) \
520 inline void v##name \
521 (std::size_t n, const float *a, float *y) \
523 n < VSMC_VMATH_THRESHOLD_##name ? \
524 v##name<float>(n, a, y): \
525 ::vs##name(static_cast<MKL_INT>(n), a, y); \
527 inline void v##name \
528 (std::size_t n, const double *a, double *y) \
530 n < VSMC_VMATH_THRESHOLD_##name ? \
531 v##name<double>(n, a, y): \
532 ::vd##name(static_cast<MKL_INT>(n), a, y); \
535 #define VSMC_DEFINE_MATH_VMATH_VML_2(name) \
536 inline void v##name \
537 (std::size_t n, const float *a, const float *b, float *y) \
539 n < VSMC_VMATH_THRESHOLD_##name ? \
540 v##name<float>(n, a, b, y): \
541 ::vs##name(static_cast<MKL_INT>(n), a, b, y); \
543 inline void v##name \
544 (std::size_t n, const double *a, const double *b, double *y) \
546 n < VSMC_VMATH_THRESHOLD_##name ? \
547 v##name<double>(n, a, b, y): \
548 ::vd##name(static_cast<MKL_INT>(n), a, b, y); \
560 inline
void vLinearFrac (std::
size_t n, const
float *a, const
float *b,
561 float beta_a,
float beta_b,
float mu_a,
float mu_b,
float *y)
564 vLinearFrac<float>(n, a, b, beta_a, beta_b, mu_a, mu_b, y):
565 ::vsLinearFrac(static_cast<MKL_INT>(n), a, b,
566 beta_a, beta_b, mu_a, mu_b, y);
568 inline void vLinearFrac (std::size_t n,
const double *a,
const double *b,
569 double beta_a,
double beta_b,
double mu_a,
double mu_b,
double *y)
572 vLinearFrac<double>(n, a, b, beta_a, beta_b, mu_a, mu_b, y):
573 ::vdLinearFrac(static_cast<MKL_INT>(n), a, b,
574 beta_a, beta_b, mu_a, mu_b, y);
586 inline
void vPowx (std::
size_t n, const
float *a,
float b,
float *y)
589 vPowx<float>(n, a, b, y):
590 ::vsPowx(static_cast<MKL_INT>(n), a, b, y);
592 inline void vPowx (std::size_t n,
const double *a,
double b,
double *y)
595 vPowx<double>(n, a, b, y):
596 ::vdPowx(static_cast<MKL_INT>(n), a, b, y);
608 inline
void vSinCos (std::
size_t n, const
float *a,
float *y,
float *z)
611 vSinCos<float>(n, a, y, z):
612 ::vsSinCos(static_cast<MKL_INT>(n), a, y, z);
614 inline void vSinCos (std::size_t n,
const double *a,
double *y,
double *z)
617 vSinCos<double>(n, a, y, z):
618 ::vdSinCos(static_cast<MKL_INT>(n), a, y, z);
646 #elif VSMC_USE_VECLIB_VFORCE
648 #define VSMC_DEFINE_MATH_VMATH_VFORCE_1(func, name) \
649 inline void v##name \
650 (std::size_t n, const float *a, float *y) \
652 const int in = static_cast<int>(n); \
653 n < VSMC_VMATH_THRESHOLD_##name ? \
654 v##name<float>(n, a, y): \
655 ::vv##func##f(y, a, &in); \
657 inline void v##name \
658 (std::size_t n, const double *a, double *y) \
660 const int in = static_cast<int>(n); \
661 n < VSMC_VMATH_THRESHOLD_##name ? \
662 v##name<double>(n, a, y): \
663 ::vv##func(y, a, &in); \
666 #define VSMC_DEFINE_MATH_VMATH_VFORCE_2(func, name) \
667 inline void v##name \
668 (std::size_t n, const float *a, const float *b, float *y) \
670 const int in = static_cast<int>(n); \
671 n < VSMC_VMATH_THRESHOLD_##name ? \
672 v##name<float>(n, a, b, y): \
673 ::vv##func##f(y, a, b, &in); \
675 inline void v##name \
676 (std::size_t n, const double *a, const double *b, double *y) \
678 const int in = static_cast<int>(n); \
679 n < VSMC_VMATH_THRESHOLD_##name ? \
680 v##name<double>(n, a, b, y): \
681 ::vv##func(y, a, b, &in); \
688 VSMC_DEFINE_MATH_VMATH_VFORCE_1(rec, Inv)
689 VSMC_DEFINE_MATH_VMATH_VFORCE_2(div, Div)
690 VSMC_DEFINE_MATH_VMATH_VFORCE_1(sqrt, Sqrt)
691 VSMC_DEFINE_MATH_VMATH_VFORCE_1(rsqrt, InvSqrt)
692 VSMC_DEFINE_MATH_VMATH_VFORCE_2(pow, Pow)
694 VSMC_DEFINE_MATH_VMATH_VFORCE_1(exp, Exp)
695 VSMC_DEFINE_MATH_VMATH_VFORCE_1(log, Ln)
696 VSMC_DEFINE_MATH_VMATH_VFORCE_1(log10, Log10)
697 VSMC_DEFINE_MATH_VMATH_VFORCE_1(log1p, Log1p)
699 VSMC_DEFINE_MATH_VMATH_VFORCE_1(cos, Cos)
700 VSMC_DEFINE_MATH_VMATH_VFORCE_1(sin, Sin)
701 inline void vSinCos (std::size_t n,
const float *a,
float *y,
float *z)
703 int in =
static_cast<int>(n);
705 vSinCos<float>(n, a, y, z):
706 ::vvsincosf(z, y, a, &in);
708 inline void vSinCos (std::size_t n,
const double *a,
double *y,
double *z)
710 int in =
static_cast<int>(n);
712 vSinCos<double>(n, a, y, z):
713 ::vvsincos(z, y, a, &in);
715 VSMC_DEFINE_MATH_VMATH_VFORCE_1(tan, Tan)
716 VSMC_DEFINE_MATH_VMATH_VFORCE_1(acos, Acos)
717 VSMC_DEFINE_MATH_VMATH_VFORCE_1(asin, Asin)
718 VSMC_DEFINE_MATH_VMATH_VFORCE_1(atan, Atan)
719 VSMC_DEFINE_MATH_VMATH_VFORCE_2(atan2, Atan2)
721 VSMC_DEFINE_MATH_VMATH_VFORCE_1(cosh, Cosh)
722 VSMC_DEFINE_MATH_VMATH_VFORCE_1(sinh, Sinh)
723 VSMC_DEFINE_MATH_VMATH_VFORCE_1(tanh, Tanh)
724 VSMC_DEFINE_MATH_VMATH_VFORCE_1(acosh, Acosh)
725 VSMC_DEFINE_MATH_VMATH_VFORCE_1(asinh, Asinh)
726 VSMC_DEFINE_MATH_VMATH_VFORCE_1(atanh, Atanh)
732 #endif // VSMC_USE_MKL_VML
734 #endif // VSMC_MATH_VMATH_HPP
void vSinCos(std::size_t n, const T *a, T *y, T *z)
For , compute .
#define VSMC_VMATH_THRESHOLD_Powx
#define VSMC_DEFINE_MATH_VMATH_VML_2(name)
#define VSMC_DEFINE_MATH_VMATH_2(ns, func, name)
#define VSMC_DEFINE_MATH_VMATH_1(ns, func, name)
void vPowx(std::size_t n, const T *a, T b, T *y)
For , compute .
#define VSMC_VMATH_THRESHOLD_SinCos
#define VSMC_VMATH_THRESHOLD_LinearFrac
void vLinearFrac(std::size_t n, const T *a, const T *b, T beta_a, T beta_b, T mu_a, T mu_b, T *y)
For , compute .
#define VSMC_DEFINE_MATH_VMATH_VML_1(name)
#define VSMC_DEFINE_MATH_VMATH_B(op, vname)