10 #ifndef EIGEN_CXX11_TENSOR_TENSOR_FUNCTORS_H 11 #define EIGEN_CXX11_TENSOR_TENSOR_FUNCTORS_H 20 template <
typename Scalar>
21 struct scalar_mod_op {
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>
27 struct functor_traits<scalar_mod_op<Scalar> >
28 {
enum { Cost = scalar_div_cost<Scalar,false>::value, PacketAccess =
false }; };
34 template <
typename Scalar>
35 struct scalar_mod2_op {
36 EIGEN_EMPTY_STRUCT_CTOR(scalar_mod2_op);
37 EIGEN_DEVICE_FUNC
inline Scalar operator() (
const Scalar& a,
const Scalar& b)
const {
return a % b; }
39 template <
typename Scalar>
40 struct functor_traits<scalar_mod2_op<Scalar> >
41 {
enum { Cost = scalar_div_cost<Scalar,false>::value, PacketAccess =
false }; };
43 template <
typename Scalar>
44 struct scalar_fmod_op {
45 EIGEN_EMPTY_STRUCT_CTOR(scalar_fmod_op);
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>
52 struct functor_traits<scalar_fmod_op<Scalar> > {
54 PacketAccess =
false };
63 struct scalar_sigmoid_op {
64 EIGEN_EMPTY_STRUCT_CTOR(scalar_sigmoid_op)
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
71 Packet packetOp(
const Packet& x)
const {
72 const Packet one = pset1<Packet>(T(1));
73 return pdiv(one, padd(one, pexp(pnegate(x))));
78 struct functor_traits<scalar_sigmoid_op<T> > {
80 Cost = NumTraits<T>::AddCost * 2 + NumTraits<T>::MulCost * 6,
81 PacketAccess = packet_traits<T>::HasAdd && packet_traits<T>::HasDiv &&
82 packet_traits<T>::HasNegate && packet_traits<T>::HasExp
87 template<
typename Reducer,
typename Device>
88 struct reducer_traits {
96 template <
typename T>
struct SumReducer
98 static const bool PacketAccess = packet_traits<T>::HasAdd;
99 static const bool IsStateful =
false;
101 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void reduce(
const T t, T* accum)
const {
102 internal::scalar_sum_op<T> sum_op;
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 {
111 internal::scalar_cast_op<int, T> conv;
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 {
127 internal::scalar_sum_op<T> sum_op;
128 return sum_op(saccum, predux(vaccum));
132 template <
typename T,
typename Device>
133 struct reducer_traits<SumReducer<T>, Device> {
135 Cost = NumTraits<T>::AddCost,
136 PacketAccess = PacketType<T, Device>::HasAdd
141 template <
typename T>
struct MeanReducer
143 static const bool PacketAccess = packet_traits<T>::HasAdd && !NumTraits<T>::IsInteger;
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) {
150 internal::scalar_sum_op<T> sum_op;
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 {
161 internal::scalar_cast_op<int, T> conv;
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 {
177 internal::scalar_sum_op<T> sum_op;
178 return sum_op(saccum, predux(vaccum)) / (scalarCount_ + packetCount_ * unpacket_traits<Packet>::size);
182 DenseIndex scalarCount_;
183 DenseIndex packetCount_;
186 template <
typename T,
typename Device>
187 struct reducer_traits<MeanReducer<T>, Device> {
189 Cost = NumTraits<T>::AddCost,
190 PacketAccess = PacketType<T, Device>::HasAdd
195 template <
typename T,
bool IsMax = true,
bool IsInteger = true>
196 struct MinMaxBottomValue {
197 EIGEN_DEVICE_FUNC
static EIGEN_STRONG_INLINE T bottom_value() {
198 return Eigen::NumTraits<T>::lowest();
201 template <
typename T>
202 struct MinMaxBottomValue<T, true, false> {
203 EIGEN_DEVICE_FUNC
static EIGEN_STRONG_INLINE T bottom_value() {
204 return -Eigen::NumTraits<T>::infinity();
207 template <
typename T>
208 struct MinMaxBottomValue<T, false, true> {
209 EIGEN_DEVICE_FUNC
static EIGEN_STRONG_INLINE T bottom_value() {
210 return Eigen::NumTraits<T>::highest();
213 template <
typename T>
214 struct MinMaxBottomValue<T, false, false> {
215 EIGEN_DEVICE_FUNC
static EIGEN_STRONG_INLINE T bottom_value() {
216 return Eigen::NumTraits<T>::infinity();
221 template <
typename T>
struct MaxReducer
223 static const bool PacketAccess = packet_traits<T>::HasMax;
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 {
234 return MinMaxBottomValue<T, true, Eigen::NumTraits<T>::IsInteger>::bottom_value();
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>
254 struct reducer_traits<MaxReducer<T>, Device> {
256 Cost = NumTraits<T>::AddCost,
257 PacketAccess = PacketType<T, Device>::HasMax
262 template <
typename T>
struct MinReducer
264 static const bool PacketAccess = packet_traits<T>::HasMin;
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 {
275 return MinMaxBottomValue<T, false, Eigen::NumTraits<T>::IsInteger>::bottom_value();
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>
295 struct reducer_traits<MinReducer<T>, Device> {
297 Cost = NumTraits<T>::AddCost,
298 PacketAccess = PacketType<T, Device>::HasMin
303 template <
typename T>
struct ProdReducer
305 static const bool PacketAccess = packet_traits<T>::HasMul;
306 static const bool IsStateful =
false;
308 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void reduce(
const T t, T* accum)
const {
309 internal::scalar_product_op<T> prod_op;
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 {
318 internal::scalar_cast_op<int, T> conv;
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 {
334 internal::scalar_product_op<T> prod_op;
335 return prod_op(saccum, predux_mul(vaccum));
339 template <
typename T,
typename Device>
340 struct reducer_traits<ProdReducer<T>, Device> {
342 Cost = NumTraits<T>::MulCost,
343 PacketAccess = PacketType<T, Device>::HasMul
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>
365 struct reducer_traits<AndReducer, 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>
389 struct reducer_traits<OrReducer, Device> {
398 template <
typename T>
struct ArgMaxTupleReducer
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 {
407 return T(0, NumTraits<typename T::second_type>::lowest());
409 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(
const T& accum)
const {
414 template <
typename T,
typename Device>
415 struct reducer_traits<ArgMaxTupleReducer<T>, Device> {
417 Cost = NumTraits<T>::AddCost,
423 template <
typename T>
struct ArgMinTupleReducer
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 {
432 return T(0, NumTraits<typename T::second_type>::highest());
434 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(
const T& accum)
const {
439 template <
typename T,
typename Device>
440 struct reducer_traits<ArgMinTupleReducer<T>, Device> {
442 Cost = NumTraits<T>::AddCost,
448 template <
typename T,
typename Index,
size_t NumDims>
449 class GaussianGenerator {
451 static const bool PacketAccess =
false;
453 EIGEN_DEVICE_FUNC GaussianGenerator(
const array<T, NumDims>& means,
454 const array<T, NumDims>& std_devs)
457 for (
size_t i = 0; i < NumDims; ++i) {
458 m_two_sigmas[i] = std_devs[i] * std_devs[i] * 2;
462 EIGEN_DEVICE_FUNC T operator()(
const array<Index, NumDims>& coordinates)
const {
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);
472 array<T, NumDims> m_means;
473 array<T, NumDims> m_two_sigmas;
476 template <
typename T,
typename Index,
size_t NumDims>
477 struct functor_traits<GaussianGenerator<T, Index, NumDims> > {
479 Cost = NumDims * (2 * NumTraits<T>::AddCost + NumTraits<T>::MulCost +
480 functor_traits<scalar_quotient_op<T, T> >::Cost) +
481 functor_traits<scalar_exp_op<T> >::Cost,
482 PacketAccess = GaussianGenerator<T, Index, NumDims>::PacketAccess
489 #endif // EIGEN_CXX11_TENSOR_TENSOR_FUNCTORS_H Namespace containing all symbols from the Eigen library.
Definition: AdolcForward:45