10 #ifndef EIGEN_CXX11_TENSOR_TENSOR_FUNCTORS_H 11 #define EIGEN_CXX11_TENSOR_TENSOR_FUNCTORS_H 20 template <
typename Scalar>
22 EIGEN_DEVICE_FUNC
scalar_mod_op(
const Scalar& divisor) : m_divisor(divisor) {}
23 EIGEN_DEVICE_FUNC
inline Scalar operator() (
const Scalar& a)
const {
return a % m_divisor; }
24 const Scalar m_divisor;
26 template <
typename Scalar>
34 template <
typename Scalar>
37 EIGEN_DEVICE_FUNC
inline Scalar operator() (
const Scalar& a,
const Scalar& b)
const {
return a % b; }
39 template <
typename Scalar>
43 template <
typename Scalar>
46 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar
47 operator()(
const Scalar& a,
const Scalar& b)
const {
48 return numext::fmod(a, b);
51 template <
typename Scalar>
54 PacketAccess =
false };
65 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
T operator()(
const T& x)
const {
67 return one / (one + numext::exp(-x));
70 template <
typename Packet> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
72 const Packet one = pset1<Packet>(
T(1));
73 return pdiv(one, padd(one, pexp(pnegate(x))));
87 template<
typename Reducer,
typename Device>
99 static const bool IsStateful =
false;
101 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void reduce(
const T t,
T* accum)
const {
103 *accum = sum_op(*accum, t);
105 template <
typename Packet>
106 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void reducePacket(
const Packet& p,
Packet* accum)
const {
107 (*accum) = padd<Packet>(*accum, p);
110 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
T initialize()
const {
114 template <
typename Packet>
115 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
Packet initializePacket()
const {
116 return pset1<Packet>(initialize());
118 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
T finalize(
const T accum)
const {
121 template <
typename Packet>
122 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
Packet finalizePacket(
const Packet& vaccum)
const {
125 template <
typename Packet>
126 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
T finalizeBoth(
const T saccum,
const Packet& vaccum)
const {
128 return sum_op(saccum, predux(vaccum));
132 template <
typename T,
typename Device>
144 static const bool IsStateful =
true;
146 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
147 MeanReducer() : scalarCount_(0), packetCount_(0) { }
149 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void reduce(
const T t,
T* accum) {
151 *accum = sum_op(*accum, t);
154 template <
typename Packet>
155 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void reducePacket(
const Packet& p,
Packet* accum) {
156 (*accum) = padd<Packet>(*accum, p);
160 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
T initialize()
const {
164 template <
typename Packet>
165 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
Packet initializePacket()
const {
166 return pset1<Packet>(initialize());
168 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
T finalize(
const T accum)
const {
169 return accum / scalarCount_;
171 template <
typename Packet>
172 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
Packet finalizePacket(
const Packet& vaccum)
const {
173 return pdiv(vaccum, pset1<Packet>(packetCount_));
175 template <
typename Packet>
176 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
T finalizeBoth(
const T saccum,
const Packet& vaccum)
const {
182 DenseIndex scalarCount_;
183 DenseIndex packetCount_;
186 template <
typename T,
typename Device>
195 template <
typename T,
bool IsMax = true,
bool IsInteger = true>
197 EIGEN_DEVICE_FUNC
static EIGEN_STRONG_INLINE
T bottom_value() {
201 template <
typename T>
203 EIGEN_DEVICE_FUNC
static EIGEN_STRONG_INLINE
T bottom_value() {
207 template <
typename T>
209 EIGEN_DEVICE_FUNC
static EIGEN_STRONG_INLINE
T bottom_value() {
213 template <
typename T>
215 EIGEN_DEVICE_FUNC
static EIGEN_STRONG_INLINE
T bottom_value() {
224 static const bool IsStateful =
false;
226 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void reduce(
const T t,
T* accum)
const {
227 if (t > *accum) { *accum = t; }
229 template <
typename Packet>
230 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void reducePacket(
const Packet& p,
Packet* accum)
const {
231 (*accum) = pmax<Packet>(*accum, p);
233 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
T initialize()
const {
236 template <
typename Packet>
237 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
Packet initializePacket()
const {
238 return pset1<Packet>(initialize());
240 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
T finalize(
const T accum)
const {
243 template <
typename Packet>
244 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
Packet finalizePacket(
const Packet& vaccum)
const {
247 template <
typename Packet>
248 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
T finalizeBoth(
const T saccum,
const Packet& vaccum)
const {
249 return numext::maxi(saccum, predux_max(vaccum));
253 template <
typename T,
typename Device>
265 static const bool IsStateful =
false;
267 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void reduce(
const T t,
T* accum)
const {
268 if (t < *accum) { *accum = t; }
270 template <
typename Packet>
271 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void reducePacket(
const Packet& p,
Packet* accum)
const {
272 (*accum) = pmin<Packet>(*accum, p);
274 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
T initialize()
const {
277 template <
typename Packet>
278 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
Packet initializePacket()
const {
279 return pset1<Packet>(initialize());
281 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
T finalize(
const T accum)
const {
284 template <
typename Packet>
285 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
Packet finalizePacket(
const Packet& vaccum)
const {
288 template <
typename Packet>
289 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
T finalizeBoth(
const T saccum,
const Packet& vaccum)
const {
290 return numext::mini(saccum, predux_min(vaccum));
294 template <
typename T,
typename Device>
306 static const bool IsStateful =
false;
308 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void reduce(
const T t,
T* accum)
const {
310 (*accum) = prod_op(*accum, t);
312 template <
typename Packet>
313 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void reducePacket(
const Packet& p,
Packet* accum)
const {
314 (*accum) = pmul<Packet>(*accum, p);
317 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
T initialize()
const {
321 template <
typename Packet>
322 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
Packet initializePacket()
const {
323 return pset1<Packet>(initialize());
325 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
T finalize(
const T accum)
const {
328 template <
typename Packet>
329 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
Packet finalizePacket(
const Packet& vaccum)
const {
332 template <
typename Packet>
333 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
T finalizeBoth(
const T saccum,
const Packet& vaccum)
const {
335 return prod_op(saccum, predux_mul(vaccum));
339 template <
typename T,
typename Device>
350 static const bool PacketAccess =
false;
351 static const bool IsStateful =
false;
353 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void reduce(
bool t,
bool* accum)
const {
354 *accum = *accum && t;
356 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool initialize()
const {
359 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool finalize(
bool accum)
const {
364 template <
typename Device>
374 static const bool PacketAccess =
false;
375 static const bool IsStateful =
false;
377 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void reduce(
bool t,
bool* accum)
const {
378 *accum = *accum || t;
380 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool initialize()
const {
383 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool finalize(
bool accum)
const {
388 template <
typename Device>
400 static const bool PacketAccess =
false;
401 static const bool IsStateful =
false;
403 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void reduce(
const T t,
T* accum)
const {
404 if (t.second > accum->second) { *accum = t; }
406 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
T initialize()
const {
409 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
T finalize(
const T& accum)
const {
414 template <
typename T,
typename Device>
425 static const bool PacketAccess =
false;
426 static const bool IsStateful =
false;
428 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void reduce(
const T& t,
T* accum)
const {
429 if (t.second < accum->second) { *accum = t; }
431 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
T initialize()
const {
434 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
T finalize(
const T& accum)
const {
439 template <
typename T,
typename Device>
448 template <
typename T,
typename Index,
size_t NumDims>
451 static const bool PacketAccess =
false;
457 for (
size_t i = 0; i < NumDims; ++i) {
458 m_two_sigmas[i] = std_devs[i] * std_devs[i] * 2;
464 for (
size_t i = 0; i < NumDims; ++i) {
465 T offset = coordinates[i] - m_means[i];
466 tmp += offset * offset / m_two_sigmas[i];
468 return numext::exp(-tmp);
476 template <
typename T,
typename Index,
size_t NumDims>
489 #endif // EIGEN_CXX11_TENSOR_TENSOR_FUNCTORS_H Definition: TensorFunctors.h:96
Definition: TensorFunctors.h:449
Definition: TensorFunctors.h:398
Definition: XprHelper.h:158
Definition: TensorFunctors.h:196
Definition: TensorFunctors.h:423
Definition: BinaryFunctors.h:32
Definition: TensorFunctors.h:88
Definition: TensorFunctors.h:221
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:85
Definition: UnaryFunctors.h:152
Definition: TensorFunctors.h:303
Holds information about the various numeric (i.e.
Definition: NumTraits.h:150
Definition: UnaryFunctors.h:231
Definition: EmulateCXX11Meta.h:212
Definition: GenericPacketMath.h:96
Definition: BinaryFunctors.h:76
Definition: TensorFunctors.h:35
Definition: TensorFunctors.h:44
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:33
Definition: TensorFunctors.h:262
Definition: TensorFunctors.h:21
Definition: EmulateArray.h:21
Definition: TensorFunctors.h:348
Definition: PacketMath.h:48
Definition: BandTriangularSolver.h:13
Definition: XprHelper.h:146
Definition: TensorFunctors.h:373
Definition: XprHelper.h:666
Definition: TensorMeta.h:50
Definition: TensorFunctors.h:63
Definition: TensorFunctors.h:141