TR-mbed 1.0
Loading...
Searching...
No Matches
TensorFunctors.h
Go to the documentation of this file.
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2014 Benoit Steiner <benoit.steiner.goog@gmail.com>
5//
6// This Source Code Form is subject to the terms of the Mozilla
7// Public License v. 2.0. If a copy of the MPL was not distributed
8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
10#ifndef EIGEN_CXX11_TENSOR_TENSOR_FUNCTORS_H
11#define EIGEN_CXX11_TENSOR_TENSOR_FUNCTORS_H
12
13namespace Eigen {
14namespace internal {
15
16
20template <typename Scalar>
26template <typename Scalar>
29
30
34template <typename Scalar>
39template <typename Scalar>
42
43template <typename Scalar>
51template <typename Scalar>
53 enum { Cost = 13, // Reciprocal throughput of FPREM on Haswell.
54 PacketAccess = false };
55};
56
57template<typename Reducer, typename Device>
59 enum {
60 Cost = 1,
61 PacketAccess = false,
62 IsStateful = false,
64 };
65};
66
67// Standard reduction functors
68template <typename T> struct SumReducer
69{
70 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) const {
72 *accum = sum_op(*accum, t);
73 }
74 template <typename Packet>
76 (*accum) = padd<Packet>(*accum, p);
77 }
78
83 template <typename Packet>
88 return accum;
89 }
90 template <typename Packet>
94 template <typename Packet>
99};
100
101template <typename T, typename Device>
110
111template <typename T> struct MeanReducer
112{
115
118 *accum = sum_op(*accum, t);
119 scalarCount_++;
120 }
121 template <typename Packet>
123 (*accum) = padd<Packet>(*accum, p);
124 packetCount_++;
125 }
126
131 template <typename Packet>
139 template <typename Packet>
143 template <typename Packet>
151
152 protected:
155};
156
157template <typename T, typename Device>
167
168
169template <typename T, bool IsMax = true, bool IsInteger = true>
175template <typename T>
181template <typename T>
187template <typename T>
193
194
195template <typename T, int NaNPropagation=PropagateFast> struct MaxReducer
196{
197 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) const {
199 *accum = op(t, *accum);
200 }
201 template <typename Packet>
204 (*accum) = op.packetOp(*accum, p);
205 }
207 return MinMaxBottomValue<T, /*IsMax=*/true, Eigen::NumTraits<T>::IsInteger>::bottom_value();
208 }
209 template <typename Packet>
214 return accum;
215 }
216 template <typename Packet>
220 template <typename Packet>
225};
226
227template <typename T, typename Device, int NaNPropagation>
236
237template <typename T, int NaNPropagation=PropagateFast> struct MinReducer
238{
239 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) const {
241 *accum = op(t, *accum);
242 }
243 template <typename Packet>
246 (*accum) = op.packetOp(*accum, p);
247 }
249 return MinMaxBottomValue<T, /*IsMax=*/false, Eigen::NumTraits<T>::IsInteger>::bottom_value();
250 }
251 template <typename Packet>
256 return accum;
257 }
258 template <typename Packet>
262 template <typename Packet>
267};
268
269template <typename T, typename Device, int NaNPropagation>
278
279template <typename T> struct ProdReducer
280{
281 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) const {
283 (*accum) = prod_op(*accum, t);
284 }
285 template <typename Packet>
287 (*accum) = pmul<Packet>(*accum, p);
288 }
293 template <typename Packet>
298 return accum;
299 }
300 template <typename Packet>
304 template <typename Packet>
309};
310
311template <typename T, typename Device>
320
321
323{
324 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(bool t, bool* accum) const {
325 *accum = *accum && t;
326 }
328 return true;
329 }
331 return accum;
332 }
333};
334
335template <typename Device>
336struct reducer_traits<AndReducer, Device> {
337 enum {
338 Cost = 1,
340 IsStateful = false,
342 };
343};
344
345
346struct OrReducer {
347 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(bool t, bool* accum) const {
348 *accum = *accum || t;
349 }
351 return false;
352 }
354 return accum;
355 }
356};
357
358template <typename Device>
359struct reducer_traits<OrReducer, Device> {
360 enum {
361 Cost = 1,
363 IsStateful = false,
365 };
366};
367
368// Argmin/Argmax reducers. Returns the first occurrence if multiple locations
369// contain the same min/max value.
370template <typename T> struct ArgMaxTupleReducer
371{
372 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) const {
373 if (t.second < accum->second) {
374 return;
375 } else if (t.second > accum->second || accum->first > t.first ) {
376 *accum = t;
377 }
378 }
383 return accum;
384 }
385};
386
387template <typename T, typename Device>
396
397
398template <typename T> struct ArgMinTupleReducer
399{
400 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T& t, T* accum) const {
401 if (t.second > accum->second) {
402 return;
403 } else if (t.second < accum->second || accum->first > t.first) {
404 *accum = t;
405 }
406 }
411 return accum;
412 }
413};
414
415template <typename T, typename Device>
424
425
426template <typename T, typename Index, size_t NumDims>
428 public:
429 static const bool PacketAccess = false;
430
433 : m_means(means)
434 {
436 for (size_t i = 0; i < NumDims; ++i) {
437 m_two_sigmas[i] = std_devs[i] * std_devs[i] * 2;
438 }
439 }
440
442 T tmp = T(0);
444 for (size_t i = 0; i < NumDims; ++i) {
445 T offset = coordinates[i] - m_means[i];
446 tmp += offset * offset / m_two_sigmas[i];
447 }
448 return numext::exp(-tmp);
449 }
450
451 private:
452 array<T, NumDims> m_means;
453 array<T, NumDims> m_two_sigmas;
454};
455
456template <typename T, typename Index, size_t NumDims>
465
466template <typename Scalar>
481template<typename Scalar>
484
485} // end namespace internal
486} // end namespace Eigen
487
488#endif // EIGEN_CXX11_TENSOR_TENSOR_FUNCTORS_H
ArrayXXi a
Definition Array_initializer_list_23_cxx11.cpp:1
int i
Definition BiCGSTAB_step_by_step.cpp:9
#define EIGEN_UNROLL_LOOP
Definition Macros.h:1461
#define EIGEN_DEVICE_FUNC
Definition Macros.h:976
#define EIGEN_STRONG_INLINE
Definition Macros.h:917
float * p
Definition Tutorial_Map_using.cpp:9
Eigen::Triplet< double > T
Definition Tutorial_sparse_example.cpp:6
#define EIGEN_EMPTY_STRUCT_CTOR(X)
Definition XprHelper.h:22
Scalar * b
Definition benchVecAdd.cpp:17
SCALAR Scalar
Definition bench_gemm.cpp:46
Definition TensorFunctors.h:427
EIGEN_DEVICE_FUNC GaussianGenerator(const array< T, NumDims > &means, const array< T, NumDims > &std_devs)
Definition TensorFunctors.h:431
EIGEN_DEVICE_FUNC T operator()(const array< Index, NumDims > &coordinates) const
Definition TensorFunctors.h:441
static const bool PacketAccess
Definition TensorFunctors.h:429
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy x
Definition gnuplot_common_settings.hh:12
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy y set format x g set format y g set format x2 g set format y2 g set format z g set angles radians set nogrid set key title set key left top Right noreverse box linetype linewidth samplen spacing width set nolabel set noarrow set nologscale set logscale x set set pointsize set encoding default set nopolar set noparametric set set set set surface set nocontour set clabel set mapping cartesian set nohidden3d set cntrparam order set cntrparam linear set cntrparam levels auto set cntrparam points set size set set xzeroaxis lt lw set x2zeroaxis lt lw set yzeroaxis lt lw set y2zeroaxis lt lw set tics in set ticslevel set tics set mxtics default set mytics default set mx2tics default set my2tics default set xtics border mirror norotate autofreq set ytics border mirror norotate autofreq set ztics border nomirror norotate autofreq set nox2tics set noy2tics set timestamp bottom norotate offset
Definition gnuplot_common_settings.hh:64
@ PropagateFast
Definition Constants.h:341
EIGEN_DEVICE_FUNC unpacket_traits< Packet >::type predux(const Packet &a)
Definition GenericPacketMath.h:875
EIGEN_DEVICE_FUNC Packet pdiv(const Packet &a, const Packet &b)
Definition GenericPacketMath.h:244
EIGEN_DEVICE_FUNC Packet pmax(const Packet &a, const Packet &b)
Definition GenericPacketMath.h:524
EIGEN_DEVICE_FUNC unpacket_traits< Packet >::type predux_mul(const Packet &a)
Definition GenericPacketMath.h:882
EIGEN_DEVICE_FUNC Packet pmin(const Packet &a, const Packet &b)
Definition GenericPacketMath.h:512
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T maxi(const T &x, const T &y)
Definition MathFunctions.h:1091
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T fmod(const T &a, const T &b)
Definition MathFunctions.h:1807
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T exp(const T &x)
Definition MathFunctions.h:1546
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T mini(const T &x, const T &y)
Definition MathFunctions.h:1083
Namespace containing all symbols from the Eigen library.
Definition bench_norm.cpp:85
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:74
EIGEN_DEFAULT_DENSE_INDEX_TYPE DenseIndex
Definition Meta.h:66
Definition BandTriangularSolver.h:13
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition NumTraits.h:233
Definition TensorMeta.h:50
Definition TensorFunctors.h:323
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(bool t, bool *accum) const
Definition TensorFunctors.h:324
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool initialize() const
Definition TensorFunctors.h:327
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool finalize(bool accum) const
Definition TensorFunctors.h:330
Definition TensorFunctors.h:371
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const
Definition TensorFunctors.h:379
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T *accum) const
Definition TensorFunctors.h:372
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T &accum) const
Definition TensorFunctors.h:382
Definition TensorFunctors.h:399
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const
Definition TensorFunctors.h:407
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T &t, T *accum) const
Definition TensorFunctors.h:400
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T &accum) const
Definition TensorFunctors.h:410
Definition TensorFunctors.h:196
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const
Definition TensorFunctors.h:213
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet initializePacket() const
Definition TensorFunctors.h:210
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const
Definition TensorFunctors.h:206
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T *accum) const
Definition TensorFunctors.h:197
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet finalizePacket(const Packet &vaccum) const
Definition TensorFunctors.h:217
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalizeBoth(const T saccum, const Packet &vaccum) const
Definition TensorFunctors.h:221
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reducePacket(const Packet &p, Packet *accum) const
Definition TensorFunctors.h:202
Definition TensorFunctors.h:112
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet finalizePacket(const Packet &vaccum) const
Definition TensorFunctors.h:140
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const
Definition TensorFunctors.h:135
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reducePacket(const Packet &p, Packet *accum)
Definition TensorFunctors.h:122
DenseIndex scalarCount_
Definition TensorFunctors.h:153
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE MeanReducer()
Definition TensorFunctors.h:114
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet initializePacket() const
Definition TensorFunctors.h:132
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const
Definition TensorFunctors.h:127
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T *accum)
Definition TensorFunctors.h:116
DenseIndex packetCount_
Definition TensorFunctors.h:154
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalizeBoth(const T saccum, const Packet &vaccum) const
Definition TensorFunctors.h:144
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T bottom_value()
Definition TensorFunctors.h:189
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T bottom_value()
Definition TensorFunctors.h:183
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T bottom_value()
Definition TensorFunctors.h:177
Definition TensorFunctors.h:170
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T bottom_value()
Definition TensorFunctors.h:171
Definition TensorFunctors.h:238
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const
Definition TensorFunctors.h:255
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalizeBoth(const T saccum, const Packet &vaccum) const
Definition TensorFunctors.h:263
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet initializePacket() const
Definition TensorFunctors.h:252
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet finalizePacket(const Packet &vaccum) const
Definition TensorFunctors.h:259
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T *accum) const
Definition TensorFunctors.h:239
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reducePacket(const Packet &p, Packet *accum) const
Definition TensorFunctors.h:244
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const
Definition TensorFunctors.h:248
Definition TensorFunctors.h:346
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(bool t, bool *accum) const
Definition TensorFunctors.h:347
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool finalize(bool accum) const
Definition TensorFunctors.h:353
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool initialize() const
Definition TensorFunctors.h:350
Definition TensorFunctors.h:280
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalizeBoth(const T saccum, const Packet &vaccum) const
Definition TensorFunctors.h:305
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const
Definition TensorFunctors.h:289
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reducePacket(const Packet &p, Packet *accum) const
Definition TensorFunctors.h:286
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const
Definition TensorFunctors.h:297
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet finalizePacket(const Packet &vaccum) const
Definition TensorFunctors.h:301
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T *accum) const
Definition TensorFunctors.h:281
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet initializePacket() const
Definition TensorFunctors.h:294
Definition TensorFunctors.h:69
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet finalizePacket(const Packet &vaccum) const
Definition TensorFunctors.h:91
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reducePacket(const Packet &p, Packet *accum) const
Definition TensorFunctors.h:75
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T *accum) const
Definition TensorFunctors.h:70
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet initializePacket() const
Definition TensorFunctors.h:84
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const
Definition TensorFunctors.h:87
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const
Definition TensorFunctors.h:79
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalizeBoth(const T saccum, const Packet &vaccum) const
Definition TensorFunctors.h:95
Definition XprHelper.h:176
@ PacketAccess
Definition XprHelper.h:180
@ Cost
Definition XprHelper.h:179
Definition GenericPacketMath.h:107
Definition TensorFunctors.h:58
@ PacketAccess
Definition TensorFunctors.h:61
@ IsStateful
Definition TensorFunctors.h:62
@ IsExactlyAssociative
Definition TensorFunctors.h:63
@ Cost
Definition TensorFunctors.h:60
Definition TensorFunctors.h:467
EIGEN_DEVICE_FUNC scalar_clamp_op(const Scalar &_min, const Scalar &_max)
Definition TensorFunctors.h:468
const Scalar m_max
Definition TensorFunctors.h:479
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet &x) const
Definition TensorFunctors.h:475
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar &x) const
Definition TensorFunctors.h:470
const Scalar m_min
Definition TensorFunctors.h:478
Definition XprHelper.h:710
Definition TensorFunctors.h:44
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar &a, const Scalar &b) const
Definition TensorFunctors.h:47
Definition TensorFunctors.h:35
Definition TensorFunctors.h:21
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar &a) const
Definition TensorFunctors.h:23
EIGEN_DEVICE_FUNC scalar_mod_op(const Scalar &divisor)
Definition TensorFunctors.h:22
const Scalar m_divisor
Definition TensorFunctors.h:24
Definition CXX11Meta.h:292
Definition ForwardDeclarations.h:17
Definition GenericPacketMath.h:133
Definition PacketMath.h:47