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 
13 // IWYU pragma: private
14 #include "./InternalHeaderCheck.h"
15 
16 namespace Eigen {
17 namespace internal {
18 
22 template <typename Scalar>
23 struct scalar_mod_op {
24  EIGEN_DEVICE_FUNC scalar_mod_op(const Scalar& divisor) : m_divisor(divisor) {}
27 };
28 template <typename Scalar>
31 };
32 
36 template <typename Scalar>
38  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a, const Scalar& b) const { return a % b; }
39 };
40 template <typename Scalar>
43 };
44 
45 template <typename Scalar>
48  return numext::fmod(a, b);
49  }
50 };
51 template <typename Scalar>
53  enum {
54  Cost = 13, // Reciprocal throughput of FPREM on Haswell.
55  PacketAccess = false
56  };
57 };
58 
59 template <typename Reducer, typename Device>
61  enum { Cost = 1, PacketAccess = false, IsStateful = false, IsExactlyAssociative = true };
62 };
63 
64 // Standard reduction functors
65 template <typename T>
66 struct SumReducer {
67  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) const {
69  *accum = sum_op(*accum, t);
70  }
71  template <typename Packet>
73  (*accum) = padd<Packet>(*accum, p);
74  }
75 
78  return conv(0);
79  }
80  template <typename Packet>
82  return pset1<Packet>(initialize());
83  }
84  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const { return accum; }
85  template <typename Packet>
87  return vaccum;
88  }
89  template <typename Packet>
90  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalizeBoth(const T saccum, const Packet& vaccum) const {
92  return sum_op(saccum, predux(vaccum));
93  }
94 };
95 
96 template <typename T, typename Device>
97 struct reducer_traits<SumReducer<T>, Device> {
98  enum {
101  IsStateful = false,
103  };
104 };
105 
106 template <typename T>
107 struct MeanReducer {
109 
112  *accum = sum_op(*accum, t);
113  scalarCount_++;
114  }
115  template <typename Packet>
117  (*accum) = padd<Packet>(*accum, p);
118  packetCount_++;
119  }
120 
123  return conv(0);
124  }
125  template <typename Packet>
127  return pset1<Packet>(initialize());
128  }
131  return quotient_op(accum, T(scalarCount_));
132  }
133  template <typename Packet>
135  return pdiv(vaccum, pset1<Packet>(T(packetCount_)));
136  }
137  template <typename Packet>
138  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalizeBoth(const T saccum, const Packet& vaccum) const {
141  return quotient_op(sum_op(saccum, predux(vaccum)), T(scalarCount_ + packetCount_ * unpacket_traits<Packet>::size));
142  }
143 
144  protected:
147 };
148 
149 template <typename T, typename Device>
150 struct reducer_traits<MeanReducer<T>, Device> {
151  enum {
154  IsStateful = true,
156  };
157 };
158 
159 template <typename T, bool IsMax = true, bool IsInteger = true>
162 };
163 template <typename T>
164 struct MinMaxBottomValue<T, true, false> {
166 };
167 template <typename T>
168 struct MinMaxBottomValue<T, false, true> {
170 };
171 template <typename T>
172 struct MinMaxBottomValue<T, false, false> {
174 };
175 
176 template <typename T, int NaNPropagation = PropagateFast>
177 struct MaxReducer {
178  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) const {
180  *accum = op(t, *accum);
181  }
182  template <typename Packet>
185  (*accum) = op.packetOp(*accum, p);
186  }
188  return MinMaxBottomValue<T, /*IsMax=*/true, Eigen::NumTraits<T>::IsInteger>::bottom_value();
189  }
190  template <typename Packet>
192  return pset1<Packet>(initialize());
193  }
194  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const { return accum; }
195  template <typename Packet>
197  return vaccum;
198  }
199  template <typename Packet>
200  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalizeBoth(const T saccum, const Packet& vaccum) const {
202  return op(saccum, op.predux(vaccum));
203  }
204 };
205 
206 template <typename T, typename Device, int NaNPropagation>
207 struct reducer_traits<MaxReducer<T, NaNPropagation>, Device> {
208  enum {
211  IsStateful = false,
212  IsExactlyAssociative = (NaNPropagation != PropagateFast)
213  };
214 };
215 
216 template <typename T, int NaNPropagation = PropagateFast>
217 struct MinReducer {
218  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) const {
220  *accum = op(t, *accum);
221  }
222  template <typename Packet>
225  (*accum) = op.packetOp(*accum, p);
226  }
228  return MinMaxBottomValue<T, /*IsMax=*/false, Eigen::NumTraits<T>::IsInteger>::bottom_value();
229  }
230  template <typename Packet>
232  return pset1<Packet>(initialize());
233  }
234  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const { return accum; }
235  template <typename Packet>
237  return vaccum;
238  }
239  template <typename Packet>
240  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalizeBoth(const T saccum, const Packet& vaccum) const {
242  return op(saccum, op.predux(vaccum));
243  }
244 };
245 
246 template <typename T, typename Device, int NaNPropagation>
247 struct reducer_traits<MinReducer<T, NaNPropagation>, Device> {
248  enum {
251  IsStateful = false,
252  IsExactlyAssociative = (NaNPropagation != PropagateFast)
253  };
254 };
255 
256 template <typename T>
257 struct ProdReducer {
258  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) const {
260  (*accum) = prod_op(*accum, t);
261  }
262  template <typename Packet>
264  (*accum) = pmul<Packet>(*accum, p);
265  }
268  return conv(1);
269  }
270  template <typename Packet>
272  return pset1<Packet>(initialize());
273  }
274  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const { return accum; }
275  template <typename Packet>
277  return vaccum;
278  }
279  template <typename Packet>
280  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalizeBoth(const T saccum, const Packet& vaccum) const {
282  return prod_op(saccum, predux_mul(vaccum));
283  }
284 };
285 
286 template <typename T, typename Device>
287 struct reducer_traits<ProdReducer<T>, Device> {
288  enum {
291  IsStateful = false,
292  IsExactlyAssociative = true
293  };
294 };
295 
296 struct AndReducer {
297  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(bool t, bool* accum) const { *accum = *accum && t; }
298  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool initialize() const { return true; }
299  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool finalize(bool accum) const { return accum; }
300 };
301 
302 template <typename Device>
303 struct reducer_traits<AndReducer, Device> {
304  enum { Cost = 1, PacketAccess = false, IsStateful = false, IsExactlyAssociative = true };
305 };
306 
307 struct OrReducer {
308  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(bool t, bool* accum) const { *accum = *accum || t; }
309  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool initialize() const { return false; }
310  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool finalize(bool accum) const { return accum; }
311 };
312 
313 template <typename Device>
314 struct reducer_traits<OrReducer, Device> {
315  enum { Cost = 1, PacketAccess = false, IsStateful = false, IsExactlyAssociative = true };
316 };
317 
318 // Argmin/Argmax reducers. Returns the first occurrence if multiple locations
319 // contain the same min/max value.
320 template <typename T>
322  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) const {
323  if (t.second < accum->second) {
324  return;
325  } else if (t.second > accum->second || accum->first > t.first) {
326  *accum = t;
327  }
328  }
331  }
332  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T& accum) const { return accum; }
333 };
334 
335 template <typename T, typename Device>
338 };
339 
340 template <typename T>
342  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T& t, T* accum) const {
343  if (t.second > accum->second) {
344  return;
345  } else if (t.second < accum->second || accum->first > t.first) {
346  *accum = t;
347  }
348  }
351  }
352  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T& accum) const { return accum; }
353 };
354 
355 template <typename T, typename Device>
358 };
359 
360 template <typename T, typename Index, size_t NumDims>
362  public:
363  static constexpr bool PacketAccess = false;
364 
366  : m_means(means) {
368  for (size_t i = 0; i < NumDims; ++i) {
369  m_two_sigmas[i] = std_devs[i] * std_devs[i] * 2;
370  }
371  }
372 
374  T tmp = T(0);
376  for (size_t i = 0; i < NumDims; ++i) {
377  T offset = coordinates[i] - m_means[i];
378  tmp += offset * offset / m_two_sigmas[i];
379  }
380  return numext::exp(-tmp);
381  }
382 
383  private:
386 };
387 
388 template <typename T, typename Index, size_t NumDims>
390  enum {
391  Cost = NumDims *
395  };
396 };
397 
398 template <typename Scalar>
400  EIGEN_DEVICE_FUNC inline scalar_clamp_op(const Scalar& _min, const Scalar& _max) : m_min(_min), m_max(_max) {}
403  }
404  template <typename Packet>
406  return internal::pmin(internal::pmax(x, pset1<Packet>(m_min)), pset1<Packet>(m_max));
407  }
408  const Scalar m_min;
409  const Scalar m_max;
410 };
411 template <typename Scalar>
413  enum {
416  };
417 };
418 
419 } // end namespace internal
420 } // end namespace Eigen
421 
422 #endif // EIGEN_CXX11_TENSOR_TENSOR_FUNCTORS_H
int i
Definition: BiCGSTAB_step_by_step.cpp:9
Eigen::Triplet< double > T
Definition: EigenUnitTest.cpp:11
#define EIGEN_UNROLL_LOOP
Definition: Macros.h:1298
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:892
#define EIGEN_STRONG_INLINE
Definition: Macros.h:834
float * p
Definition: Tutorial_Map_using.cpp:9
Scalar * b
Definition: benchVecAdd.cpp:17
SCALAR Scalar
Definition: bench_gemm.cpp:45
Definition: TensorFunctors.h:361
static constexpr bool PacketAccess
Definition: TensorFunctors.h:363
EIGEN_DEVICE_FUNC GaussianGenerator(const array< T, NumDims > &means, const array< T, NumDims > &std_devs)
Definition: TensorFunctors.h:365
EIGEN_DEVICE_FUNC T operator()(const array< Index, NumDims > &coordinates) const
Definition: TensorFunctors.h:373
array< T, NumDims > m_means
Definition: TensorFunctors.h:384
array< T, NumDims > m_two_sigmas
Definition: TensorFunctors.h:385
@ PropagateFast
Definition: Constants.h:340
const Scalar * a
Definition: level2_cplx_impl.h:32
char char * op
Definition: level2_impl.h:374
Eigen::Matrix< Scalar, Dynamic, Dynamic, ColMajor > tmp
Definition: level3_impl.h:365
EIGEN_DEVICE_FUNC Packet pdiv(const Packet &a, const Packet &b)
Definition: GenericPacketMath.h:368
EIGEN_DEVICE_FUNC Packet pmax(const Packet &a, const Packet &b)
Definition: GenericPacketMath.h:663
EIGEN_DEVICE_FUNC Packet pmin(const Packet &a, const Packet &b)
Definition: GenericPacketMath.h:649
EIGEN_DEVICE_FUNC unpacket_traits< Packet >::type predux(const Packet &a)
Definition: GenericPacketMath.h:1232
EIGEN_DEVICE_FUNC unpacket_traits< Packet >::type predux_mul(const Packet &a)
Definition: GenericPacketMath.h:1238
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T maxi(const T &x, const T &y)
Definition: MathFunctions.h:926
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T fmod(const T &a, const T &b)
Definition: MathFunctions.h:1788
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T exp(const T &x)
Definition: MathFunctions.h:1424
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T mini(const T &x, const T &y)
Definition: MathFunctions.h:920
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
std::array< T, N > array
Definition: EmulateArray.h:231
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
EIGEN_DEFAULT_DENSE_INDEX_TYPE DenseIndex
Definition: Meta.h:75
Definition: Eigen_Colamd.h:49
list x
Definition: plotDoE.py:28
t
Definition: plotPSD.py:36
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217
Definition: TensorMeta.h:47
Definition: TensorFunctors.h:296
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(bool t, bool *accum) const
Definition: TensorFunctors.h:297
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool initialize() const
Definition: TensorFunctors.h:298
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool finalize(bool accum) const
Definition: TensorFunctors.h:299
Definition: TensorFunctors.h:321
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T *accum) const
Definition: TensorFunctors.h:322
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const
Definition: TensorFunctors.h:329
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T &accum) const
Definition: TensorFunctors.h:332
Definition: TensorFunctors.h:341
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T &t, T *accum) const
Definition: TensorFunctors.h:342
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T &accum) const
Definition: TensorFunctors.h:352
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const
Definition: TensorFunctors.h:349
Definition: TensorFunctors.h:177
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const
Definition: TensorFunctors.h:194
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet initializePacket() const
Definition: TensorFunctors.h:191
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const
Definition: TensorFunctors.h:187
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T *accum) const
Definition: TensorFunctors.h:178
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet finalizePacket(const Packet &vaccum) const
Definition: TensorFunctors.h:196
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalizeBoth(const T saccum, const Packet &vaccum) const
Definition: TensorFunctors.h:200
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reducePacket(const Packet &p, Packet *accum) const
Definition: TensorFunctors.h:183
Definition: TensorFunctors.h:107
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet finalizePacket(const Packet &vaccum) const
Definition: TensorFunctors.h:134
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const
Definition: TensorFunctors.h:129
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reducePacket(const Packet &p, Packet *accum)
Definition: TensorFunctors.h:116
DenseIndex scalarCount_
Definition: TensorFunctors.h:145
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE MeanReducer()
Definition: TensorFunctors.h:108
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet initializePacket() const
Definition: TensorFunctors.h:126
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const
Definition: TensorFunctors.h:121
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T *accum)
Definition: TensorFunctors.h:110
DenseIndex packetCount_
Definition: TensorFunctors.h:146
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalizeBoth(const T saccum, const Packet &vaccum) const
Definition: TensorFunctors.h:138
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T bottom_value()
Definition: TensorFunctors.h:173
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T bottom_value()
Definition: TensorFunctors.h:169
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T bottom_value()
Definition: TensorFunctors.h:165
Definition: TensorFunctors.h:160
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T bottom_value()
Definition: TensorFunctors.h:161
Definition: TensorFunctors.h:217
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const
Definition: TensorFunctors.h:234
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalizeBoth(const T saccum, const Packet &vaccum) const
Definition: TensorFunctors.h:240
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet initializePacket() const
Definition: TensorFunctors.h:231
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet finalizePacket(const Packet &vaccum) const
Definition: TensorFunctors.h:236
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T *accum) const
Definition: TensorFunctors.h:218
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reducePacket(const Packet &p, Packet *accum) const
Definition: TensorFunctors.h:223
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const
Definition: TensorFunctors.h:227
Definition: TensorFunctors.h:307
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(bool t, bool *accum) const
Definition: TensorFunctors.h:308
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool finalize(bool accum) const
Definition: TensorFunctors.h:310
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool initialize() const
Definition: TensorFunctors.h:309
Definition: TensorFunctors.h:257
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalizeBoth(const T saccum, const Packet &vaccum) const
Definition: TensorFunctors.h:280
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const
Definition: TensorFunctors.h:266
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reducePacket(const Packet &p, Packet *accum) const
Definition: TensorFunctors.h:263
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const
Definition: TensorFunctors.h:274
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet finalizePacket(const Packet &vaccum) const
Definition: TensorFunctors.h:276
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T *accum) const
Definition: TensorFunctors.h:258
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet initializePacket() const
Definition: TensorFunctors.h:271
Definition: TensorFunctors.h:66
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet finalizePacket(const Packet &vaccum) const
Definition: TensorFunctors.h:86
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reducePacket(const Packet &p, Packet *accum) const
Definition: TensorFunctors.h:72
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T *accum) const
Definition: TensorFunctors.h:67
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet initializePacket() const
Definition: TensorFunctors.h:81
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const
Definition: TensorFunctors.h:84
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const
Definition: TensorFunctors.h:76
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalizeBoth(const T saccum, const Packet &vaccum) const
Definition: TensorFunctors.h:90
Definition: XprHelper.h:205
@ PacketAccess
Definition: XprHelper.h:206
@ Cost
Definition: XprHelper.h:206
Definition: GenericPacketMath.h:108
Definition: TensorFunctors.h:60
@ PacketAccess
Definition: TensorFunctors.h:61
@ IsStateful
Definition: TensorFunctors.h:61
@ IsExactlyAssociative
Definition: TensorFunctors.h:61
@ Cost
Definition: TensorFunctors.h:61
Template functor to cast a scalar to another type.
Definition: functors/UnaryFunctors.h:205
Definition: TensorFunctors.h:399
EIGEN_DEVICE_FUNC scalar_clamp_op(const Scalar &_min, const Scalar &_max)
Definition: TensorFunctors.h:400
const Scalar m_max
Definition: TensorFunctors.h:409
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet &x) const
Definition: TensorFunctors.h:405
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar &x) const
Definition: TensorFunctors.h:401
const Scalar m_min
Definition: TensorFunctors.h:408
Definition: XprHelper.h:883
Template functor to compute the exponential of a scalar.
Definition: functors/UnaryFunctors.h:348
Definition: TensorFunctors.h:46
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar &a, const Scalar &b) const
Definition: TensorFunctors.h:47
Template functor to compute the max of two scalars.
Definition: BinaryFunctors.h:171
Template functor to compute the min of two scalars.
Definition: BinaryFunctors.h:142
Template functor to compute the modulo between 2 arrays.
Definition: TensorFunctors.h:37
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar &a, const Scalar &b) const
Definition: TensorFunctors.h:38
Template functor to compute the modulo between an array and a scalar.
Definition: TensorFunctors.h:23
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar &a) const
Definition: TensorFunctors.h:25
EIGEN_DEVICE_FUNC scalar_mod_op(const Scalar &divisor)
Definition: TensorFunctors.h:24
const Scalar m_divisor
Definition: TensorFunctors.h:26
Template functor to compute the product of two scalars.
Definition: BinaryFunctors.h:73
Template functor to compute the quotient of two scalars.
Definition: BinaryFunctors.h:430
Template functor to compute the sum of two scalars.
Definition: BinaryFunctors.h:34
Definition: MoreMeta.h:343
Definition: GenericPacketMath.h:134
Definition: ZVector/PacketMath.h:50