Please, help us to better know about our user community by answering the following short survey: https://forms.gle/wpyrxWi18ox9Z5ae9
TensorBase.h
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_BASE_H
11 #define EIGEN_CXX11_TENSOR_TENSOR_BASE_H
12 
13 // clang-format off
14 
15 namespace Eigen {
16 
25 #ifndef EIGEN_PARSED_BY_DOXYGEN
26 // FIXME Doxygen does not like the inheritance with different template parameters
27 // Since there is no doxygen documentation inside, we disable it for now
28 template<typename Derived>
29 class TensorBase<Derived, ReadOnlyAccessors>
30 {
31  public:
32  typedef internal::traits<Derived> DerivedTraits;
33  typedef typename DerivedTraits::Scalar Scalar;
34  typedef typename DerivedTraits::Index Index;
35  typedef typename internal::remove_const<Scalar>::type CoeffReturnType;
36  static const int NumDimensions = DerivedTraits::NumDimensions;
37 
38  // Generic nullary operation support.
39  template <typename CustomNullaryOp> EIGEN_DEVICE_FUNC
40  EIGEN_STRONG_INLINE const TensorCwiseNullaryOp<CustomNullaryOp, const Derived>
41  nullaryExpr(const CustomNullaryOp& func) const {
42  return TensorCwiseNullaryOp<CustomNullaryOp, const Derived>(derived(), func);
43  }
44 
45  // Coefficient-wise nullary operators
46  EIGEN_DEVICE_FUNC
47  EIGEN_STRONG_INLINE const TensorCwiseNullaryOp<internal::scalar_constant_op<Scalar>, const Derived>
48  constant(const Scalar& value) const {
49  return nullaryExpr(internal::scalar_constant_op<Scalar>(value));
50  }
51 
52  EIGEN_DEVICE_FUNC
53  EIGEN_STRONG_INLINE const TensorCwiseNullaryOp<internal::UniformRandomGenerator<Scalar>, const Derived>
54  random() const {
55  return nullaryExpr(internal::UniformRandomGenerator<Scalar>());
56  }
57  template <typename RandomGenerator> EIGEN_DEVICE_FUNC
58  EIGEN_STRONG_INLINE const TensorCwiseNullaryOp<RandomGenerator, const Derived>
59  random(const RandomGenerator& gen = RandomGenerator()) const {
60  return nullaryExpr(gen);
61  }
62 
63  // Tensor generation
64  template <typename Generator> EIGEN_DEVICE_FUNC
65  EIGEN_STRONG_INLINE const TensorGeneratorOp<Generator, const Derived>
66  generate(const Generator& generator) const {
67  return TensorGeneratorOp<Generator, const Derived>(derived(), generator);
68  }
69 
70  // Generic unary operation support.
71  template <typename CustomUnaryOp> EIGEN_DEVICE_FUNC
72  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<CustomUnaryOp, const Derived>
73  unaryExpr(const CustomUnaryOp& func) const {
74  return TensorCwiseUnaryOp<CustomUnaryOp, const Derived>(derived(), func);
75  }
76 
77  // Coefficient-wise unary operators
78  EIGEN_DEVICE_FUNC
79  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const Derived>
80  operator-() const {
81  return unaryExpr(internal::scalar_opposite_op<Scalar>());
82  }
83 
84  EIGEN_DEVICE_FUNC
85  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_sqrt_op<Scalar>, const Derived>
86  sqrt() const {
87  return unaryExpr(internal::scalar_sqrt_op<Scalar>());
88  }
89 
90  EIGEN_DEVICE_FUNC
91  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_sign_op<Scalar>, const Derived>
92  sign() const {
93  return unaryExpr(internal::scalar_sign_op<Scalar>());
94  }
95 
96  EIGEN_DEVICE_FUNC
97  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_rsqrt_op<Scalar>, const Derived>
98  rsqrt() const {
99  return unaryExpr(internal::scalar_rsqrt_op<Scalar>());
100  }
101 
102  EIGEN_DEVICE_FUNC
103  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_square_op<Scalar>, const Derived>
104  square() const {
105  return unaryExpr(internal::scalar_square_op<Scalar>());
106  }
107 
108  EIGEN_DEVICE_FUNC
109  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_cube_op<Scalar>, const Derived>
110  cube() const {
111  return unaryExpr(internal::scalar_cube_op<Scalar>());
112  }
113 
114  EIGEN_DEVICE_FUNC
115  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_inverse_op<Scalar>, const Derived>
116  inverse() const {
117  return unaryExpr(internal::scalar_inverse_op<Scalar>());
118  }
119 
120  EIGEN_DEVICE_FUNC
121  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_tanh_op<Scalar>, const Derived>
122  tanh() const {
123  return unaryExpr(internal::scalar_tanh_op<Scalar>());
124  }
125 
126  EIGEN_DEVICE_FUNC
127  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_lgamma_op<Scalar>, const Derived>
128  lgamma() const {
129  return unaryExpr(internal::scalar_lgamma_op<Scalar>());
130  }
131 
132  EIGEN_DEVICE_FUNC
133  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_digamma_op<Scalar>, const Derived>
134  digamma() const {
135  return unaryExpr(internal::scalar_digamma_op<Scalar>());
136  }
137 
138  EIGEN_DEVICE_FUNC
139  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_bessel_i0_op<Scalar>, const Derived>
140  bessel_i0() const {
141  return unaryExpr(internal::scalar_bessel_i0_op<Scalar>());
142  }
143 
144  EIGEN_DEVICE_FUNC
145  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_bessel_i0e_op<Scalar>, const Derived>
146  bessel_i0e() const {
147  return unaryExpr(internal::scalar_bessel_i0e_op<Scalar>());
148  }
149 
150  EIGEN_DEVICE_FUNC
151  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_bessel_i1_op<Scalar>, const Derived>
152  bessel_i1() const {
153  return unaryExpr(internal::scalar_bessel_i1_op<Scalar>());
154  }
155 
156  EIGEN_DEVICE_FUNC
157  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_bessel_i1e_op<Scalar>, const Derived>
158  bessel_i1e() const {
159  return unaryExpr(internal::scalar_bessel_i1e_op<Scalar>());
160  }
161 
162  EIGEN_DEVICE_FUNC
163  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_bessel_j0_op<Scalar>, const Derived>
164  bessel_j0() const {
165  return unaryExpr(internal::scalar_bessel_j0_op<Scalar>());
166  }
167 
168  EIGEN_DEVICE_FUNC
169  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_bessel_y0_op<Scalar>, const Derived>
170  bessel_y0() const {
171  return unaryExpr(internal::scalar_bessel_y0_op<Scalar>());
172  }
173 
174  EIGEN_DEVICE_FUNC
175  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_bessel_j1_op<Scalar>, const Derived>
176  bessel_j1() const {
177  return unaryExpr(internal::scalar_bessel_j1_op<Scalar>());
178  }
179 
180  EIGEN_DEVICE_FUNC
181  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_bessel_y1_op<Scalar>, const Derived>
182  bessel_y1() const {
183  return unaryExpr(internal::scalar_bessel_y1_op<Scalar>());
184  }
185 
186  EIGEN_DEVICE_FUNC
187  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_bessel_k0_op<Scalar>, const Derived>
188  bessel_k0() const {
189  return unaryExpr(internal::scalar_bessel_k0_op<Scalar>());
190  }
191 
192  EIGEN_DEVICE_FUNC
193  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_bessel_k0e_op<Scalar>, const Derived>
194  bessel_k0e() const {
195  return unaryExpr(internal::scalar_bessel_k0e_op<Scalar>());
196  }
197 
198  EIGEN_DEVICE_FUNC
199  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_bessel_k1_op<Scalar>, const Derived>
200  bessel_k1() const {
201  return unaryExpr(internal::scalar_bessel_k1_op<Scalar>());
202  }
203 
204  EIGEN_DEVICE_FUNC
205  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_bessel_k1e_op<Scalar>, const Derived>
206  bessel_k1e() const {
207  return unaryExpr(internal::scalar_bessel_k1e_op<Scalar>());
208  }
209 
210  // igamma(a = this, x = other)
211  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
212  const TensorCwiseBinaryOp<internal::scalar_igamma_op<Scalar>, const Derived, const OtherDerived>
213  igamma(const OtherDerived& other) const {
214  return binaryExpr(other.derived(), internal::scalar_igamma_op<Scalar>());
215  }
216 
217  // igamma_der_a(a = this, x = other)
218  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
219  const TensorCwiseBinaryOp<internal::scalar_igamma_der_a_op<Scalar>, const Derived, const OtherDerived>
220  igamma_der_a(const OtherDerived& other) const {
221  return binaryExpr(other.derived(), internal::scalar_igamma_der_a_op<Scalar>());
222  }
223 
224  // gamma_sample_der_alpha(alpha = this, sample = other)
225  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
226  const TensorCwiseBinaryOp<internal::scalar_gamma_sample_der_alpha_op<Scalar>, const Derived, const OtherDerived>
227  gamma_sample_der_alpha(const OtherDerived& other) const {
228  return binaryExpr(other.derived(), internal::scalar_gamma_sample_der_alpha_op<Scalar>());
229  }
230 
231  // igammac(a = this, x = other)
232  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
233  const TensorCwiseBinaryOp<internal::scalar_igammac_op<Scalar>, const Derived, const OtherDerived>
234  igammac(const OtherDerived& other) const {
235  return binaryExpr(other.derived(), internal::scalar_igammac_op<Scalar>());
236  }
237 
238  // zeta(x = this, q = other)
239  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
240  const TensorCwiseBinaryOp<internal::scalar_zeta_op<Scalar>, const Derived, const OtherDerived>
241  zeta(const OtherDerived& other) const {
242  return binaryExpr(other.derived(), internal::scalar_zeta_op<Scalar>());
243  }
244 
245  // polygamma(n = this, x = other)
246  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
247  const TensorCwiseBinaryOp<internal::scalar_polygamma_op<Scalar>, const Derived, const OtherDerived>
248  polygamma(const OtherDerived& other) const {
249  return binaryExpr(other.derived(), internal::scalar_polygamma_op<Scalar>());
250  }
251 
252  EIGEN_DEVICE_FUNC
253  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_erf_op<Scalar>, const Derived>
254  erf() const {
255  return unaryExpr(internal::scalar_erf_op<Scalar>());
256  }
257 
258  EIGEN_DEVICE_FUNC
259  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_erfc_op<Scalar>, const Derived>
260  erfc() const {
261  return unaryExpr(internal::scalar_erfc_op<Scalar>());
262  }
263 
264  EIGEN_DEVICE_FUNC
265  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_ndtri_op<Scalar>, const Derived>
266  ndtri() const {
267  return unaryExpr(internal::scalar_ndtri_op<Scalar>());
268  }
269 
270  EIGEN_DEVICE_FUNC
271  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_logistic_op<Scalar>, const Derived>
272  sigmoid() const {
273  return unaryExpr(internal::scalar_logistic_op<Scalar>());
274  }
275 
276  EIGEN_DEVICE_FUNC
277  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_exp_op<Scalar>, const Derived>
278  exp() const {
279  return unaryExpr(internal::scalar_exp_op<Scalar>());
280  }
281 
282  EIGEN_DEVICE_FUNC
283  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_expm1_op<Scalar>, const Derived>
284  expm1() const {
285  return unaryExpr(internal::scalar_expm1_op<Scalar>());
286  }
287 
288  EIGEN_DEVICE_FUNC
289  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_log_op<Scalar>, const Derived>
290  log() const {
291  return unaryExpr(internal::scalar_log_op<Scalar>());
292  }
293 
294  EIGEN_DEVICE_FUNC
295  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_log1p_op<Scalar>, const Derived>
296  log1p() const {
297  return unaryExpr(internal::scalar_log1p_op<Scalar>());
298  }
299 
300  EIGEN_DEVICE_FUNC
301  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_log2_op<Scalar>, const Derived>
302  log2() const {
303  return unaryExpr(internal::scalar_log2_op<Scalar>());
304  }
305 
306  EIGEN_DEVICE_FUNC
307  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_abs_op<Scalar>, const Derived>
308  abs() const {
309  return unaryExpr(internal::scalar_abs_op<Scalar>());
310  }
311 
312  EIGEN_DEVICE_FUNC
313  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_clamp_op<Scalar>, const Derived>
314  clip(Scalar min, Scalar max) const {
315  return unaryExpr(internal::scalar_clamp_op<Scalar>(min, max));
316  }
317 
318  EIGEN_DEVICE_FUNC
319  EIGEN_STRONG_INLINE const typename internal::conditional<NumTraits<CoeffReturnType>::IsComplex,
320  TensorCwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, const Derived>,
321  Derived>::type
322  conjugate() const {
323  return choose(Cond<NumTraits<CoeffReturnType>::IsComplex>(), unaryExpr(internal::scalar_conjugate_op<Scalar>()), derived());
324  }
325 
326  EIGEN_DEVICE_FUNC
327  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::bind2nd_op<internal::scalar_pow_op<Scalar,Scalar> >, const Derived>
328  pow(Scalar exponent) const {
329  return unaryExpr(internal::bind2nd_op<internal::scalar_pow_op<Scalar,Scalar> >(exponent));
330  }
331 
332  EIGEN_DEVICE_FUNC
333  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_real_op<Scalar>, const Derived>
334  real() const {
335  return unaryExpr(internal::scalar_real_op<Scalar>());
336  }
337 
338  EIGEN_DEVICE_FUNC
339  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_imag_op<Scalar>, const Derived>
340  imag() const {
341  return unaryExpr(internal::scalar_imag_op<Scalar>());
342  }
343 
344  EIGEN_DEVICE_FUNC
345  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::bind2nd_op<internal::scalar_sum_op<Scalar,Scalar> >, const Derived>
346  operator+ (Scalar rhs) const {
347  return unaryExpr(internal::bind2nd_op<internal::scalar_sum_op<Scalar,Scalar> >(rhs));
348  }
349 
350  EIGEN_DEVICE_FUNC
351  EIGEN_STRONG_INLINE friend
352  const TensorCwiseUnaryOp<internal::bind1st_op<internal::scalar_sum_op<Scalar> >, const Derived>
353  operator+ (Scalar lhs, const Derived& rhs) {
354  return rhs.unaryExpr(internal::bind1st_op<internal::scalar_sum_op<Scalar> >(lhs));
355  }
356 
357  EIGEN_DEVICE_FUNC
358  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::bind2nd_op<internal::scalar_difference_op<Scalar,Scalar> >, const Derived>
359  operator- (Scalar rhs) const {
360  EIGEN_STATIC_ASSERT((NumTraits<Scalar>::IsSigned || internal::is_same<Scalar, const std::complex<float> >::value), YOU_MADE_A_PROGRAMMING_MISTAKE);
361  return unaryExpr(internal::bind2nd_op<internal::scalar_difference_op<Scalar,Scalar> >(rhs));
362  }
363 
364  EIGEN_DEVICE_FUNC
365  EIGEN_STRONG_INLINE friend
366  const TensorCwiseUnaryOp<internal::bind1st_op<internal::scalar_difference_op<Scalar> >, const Derived>
367  operator- (Scalar lhs, const Derived& rhs) {
368  return rhs.unaryExpr(internal::bind1st_op<internal::scalar_difference_op<Scalar> >(lhs));
369  }
370 
371  EIGEN_DEVICE_FUNC
372  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::bind2nd_op<internal::scalar_product_op<Scalar,Scalar> >, const Derived>
373  operator* (Scalar rhs) const {
374  return unaryExpr(internal::bind2nd_op<internal::scalar_product_op<Scalar,Scalar> >(rhs));
375  }
376 
377  EIGEN_DEVICE_FUNC
378  EIGEN_STRONG_INLINE friend
379  const TensorCwiseUnaryOp<internal::bind1st_op<internal::scalar_product_op<Scalar> >, const Derived>
380  operator* (Scalar lhs, const Derived& rhs) {
381  return rhs.unaryExpr(internal::bind1st_op<internal::scalar_product_op<Scalar> >(lhs));
382  }
383 
384  EIGEN_DEVICE_FUNC
385  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::bind2nd_op<internal::scalar_quotient_op<Scalar,Scalar> >, const Derived>
386  operator/ (Scalar rhs) const {
387  return unaryExpr(internal::bind2nd_op<internal::scalar_quotient_op<Scalar,Scalar> >(rhs));
388  }
389 
390  EIGEN_DEVICE_FUNC
391  EIGEN_STRONG_INLINE friend
392  const TensorCwiseUnaryOp<internal::bind1st_op<internal::scalar_quotient_op<Scalar> >, const Derived>
393  operator/ (Scalar lhs, const Derived& rhs) {
394  return rhs.unaryExpr(internal::bind1st_op<internal::scalar_quotient_op<Scalar> >(lhs));
395  }
396 
397  EIGEN_DEVICE_FUNC
398  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_mod_op<Scalar>, const Derived>
399  operator% (Scalar rhs) const {
400  EIGEN_STATIC_ASSERT(NumTraits<Scalar>::IsInteger, YOU_MADE_A_PROGRAMMING_MISTAKE_TRY_MOD);
401  return unaryExpr(internal::scalar_mod_op<Scalar>(rhs));
402  }
403 
404  template <int NanPropagation=PropagateFast>
405  EIGEN_DEVICE_FUNC
406  EIGEN_STRONG_INLINE const TensorCwiseBinaryOp<internal::scalar_max_op<Scalar,Scalar,NanPropagation>, const Derived, const TensorCwiseNullaryOp<internal::scalar_constant_op<Scalar>, const Derived> >
407  cwiseMax(Scalar threshold) const {
408  return cwiseMax<NanPropagation>(constant(threshold));
409  }
410 
411  template <int NanPropagation=PropagateFast>
412  EIGEN_DEVICE_FUNC
413  EIGEN_STRONG_INLINE const TensorCwiseBinaryOp<internal::scalar_min_op<Scalar,Scalar,NanPropagation>, const Derived, const TensorCwiseNullaryOp<internal::scalar_constant_op<Scalar>, const Derived> >
414  cwiseMin(Scalar threshold) const {
415  return cwiseMin<NanPropagation>(constant(threshold));
416  }
417 
418  template<typename NewType>
419  EIGEN_DEVICE_FUNC
420  EIGEN_STRONG_INLINE const typename internal::conditional<internal::is_same<NewType, CoeffReturnType>::value,
421  Derived,
422  TensorConversionOp<NewType, const Derived> >::type
423  cast() const {
424  return choose(Cond<internal::is_same<NewType, CoeffReturnType>::value>(), derived(), TensorConversionOp<NewType, const Derived>(derived()));
425  }
426 
427  EIGEN_DEVICE_FUNC
428  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_round_op<Scalar>, const Derived>
429  round() const {
430  return unaryExpr(internal::scalar_round_op<Scalar>());
431  }
432 
433  EIGEN_DEVICE_FUNC
434  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_rint_op<Scalar>, const Derived>
435  rint() const {
436  return unaryExpr(internal::scalar_rint_op<Scalar>());
437  }
438 
439  EIGEN_DEVICE_FUNC
440  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_ceil_op<Scalar>, const Derived>
441  ceil() const {
442  return unaryExpr(internal::scalar_ceil_op<Scalar>());
443  }
444 
445  EIGEN_DEVICE_FUNC
446  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_floor_op<Scalar>, const Derived>
447  floor() const {
448  return unaryExpr(internal::scalar_floor_op<Scalar>());
449  }
450 
451  // Generic binary operation support.
452  template <typename CustomBinaryOp, typename OtherDerived> EIGEN_DEVICE_FUNC
453  EIGEN_STRONG_INLINE const TensorCwiseBinaryOp<CustomBinaryOp, const Derived, const OtherDerived>
454  binaryExpr(const OtherDerived& other, const CustomBinaryOp& func) const {
455  return TensorCwiseBinaryOp<CustomBinaryOp, const Derived, const OtherDerived>(derived(), other, func);
456  }
457 
458  // Coefficient-wise binary operators.
459  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
460  const TensorCwiseBinaryOp<internal::scalar_sum_op<Scalar>, const Derived, const OtherDerived>
461  operator+(const OtherDerived& other) const {
462  return binaryExpr(other.derived(), internal::scalar_sum_op<Scalar>());
463  }
464 
465  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
466  const TensorCwiseBinaryOp<internal::scalar_difference_op<Scalar>, const Derived, const OtherDerived>
467  operator-(const OtherDerived& other) const {
468  return binaryExpr(other.derived(), internal::scalar_difference_op<Scalar>());
469  }
470 
471  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
472  const TensorCwiseBinaryOp<internal::scalar_product_op<Scalar>, const Derived, const OtherDerived>
473  operator*(const OtherDerived& other) const {
474  return binaryExpr(other.derived(), internal::scalar_product_op<Scalar>());
475  }
476 
477  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
478  const TensorCwiseBinaryOp<internal::scalar_quotient_op<Scalar>, const Derived, const OtherDerived>
479  operator/(const OtherDerived& other) const {
480  return binaryExpr(other.derived(), internal::scalar_quotient_op<Scalar>());
481  }
482 
483  template<int NaNPropagation=PropagateFast, typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
484  const TensorCwiseBinaryOp<internal::scalar_max_op<Scalar,Scalar, NaNPropagation>, const Derived, const OtherDerived>
485  cwiseMax(const OtherDerived& other) const {
486  return binaryExpr(other.derived(), internal::scalar_max_op<Scalar,Scalar, NaNPropagation>());
487  }
488 
489  template<int NaNPropagation=PropagateFast, typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
490  const TensorCwiseBinaryOp<internal::scalar_min_op<Scalar,Scalar, NaNPropagation>, const Derived, const OtherDerived>
491  cwiseMin(const OtherDerived& other) const {
492  return binaryExpr(other.derived(), internal::scalar_min_op<Scalar,Scalar, NaNPropagation>());
493  }
494 
495  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
496  const TensorCwiseBinaryOp<internal::scalar_boolean_and_op, const Derived, const OtherDerived>
497  operator&&(const OtherDerived& other) const {
498  return binaryExpr(other.derived(), internal::scalar_boolean_and_op());
499  }
500 
501  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
502  const TensorCwiseBinaryOp<internal::scalar_boolean_or_op, const Derived, const OtherDerived>
503  operator||(const OtherDerived& other) const {
504  return binaryExpr(other.derived(), internal::scalar_boolean_or_op());
505  }
506 
507  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
508  const TensorCwiseBinaryOp<internal::scalar_boolean_xor_op, const Derived, const OtherDerived>
509  operator^(const OtherDerived& other) const {
510  return binaryExpr(other.derived(), internal::scalar_boolean_xor_op());
511  }
512 
513  // Comparisons and tests.
514  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
515  const TensorCwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LT>, const Derived, const OtherDerived>
516  operator<(const OtherDerived& other) const {
517  return binaryExpr(other.derived(), internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LT>());
518  }
519  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
520  const TensorCwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LE>, const Derived, const OtherDerived>
521  operator<=(const OtherDerived& other) const {
522  return binaryExpr(other.derived(), internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LE>());
523  }
524  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
525  const TensorCwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GT>, const Derived, const OtherDerived>
526  operator>(const OtherDerived& other) const {
527  return binaryExpr(other.derived(), internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GT>());
528  }
529  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
530  const TensorCwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GE>, const Derived, const OtherDerived>
531  operator>=(const OtherDerived& other) const {
532  return binaryExpr(other.derived(), internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GE>());
533  }
534 
535  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
536  const TensorCwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_EQ>, const Derived, const OtherDerived>
537  operator==(const OtherDerived& other) const {
538  return binaryExpr(other.derived(), internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_EQ>());
539  }
540 
541  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
542  const TensorCwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_NEQ>, const Derived, const OtherDerived>
543  operator!=(const OtherDerived& other) const {
544  return binaryExpr(other.derived(), internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_NEQ>());
545  }
546 
547  // comparisons and tests for Scalars
548  EIGEN_DEVICE_FUNC
549  EIGEN_STRONG_INLINE const TensorCwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LT>, const Derived, const TensorCwiseNullaryOp<internal::scalar_constant_op<Scalar>, const Derived> >
550  operator<(Scalar threshold) const {
551  return operator<(constant(threshold));
552  }
553  EIGEN_DEVICE_FUNC
554  EIGEN_STRONG_INLINE const TensorCwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LE>, const Derived, const TensorCwiseNullaryOp<internal::scalar_constant_op<Scalar>, const Derived> >
555  operator<=(Scalar threshold) const {
556  return operator<=(constant(threshold));
557  }
558  EIGEN_DEVICE_FUNC
559  EIGEN_STRONG_INLINE const TensorCwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GT>, const Derived, const TensorCwiseNullaryOp<internal::scalar_constant_op<Scalar>, const Derived> >
560  operator>(Scalar threshold) const {
561  return operator>(constant(threshold));
562  }
563  EIGEN_DEVICE_FUNC
564  EIGEN_STRONG_INLINE const TensorCwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GE>, const Derived, const TensorCwiseNullaryOp<internal::scalar_constant_op<Scalar>, const Derived> >
565  operator>=(Scalar threshold) const {
566  return operator>=(constant(threshold));
567  }
568  EIGEN_DEVICE_FUNC
569  EIGEN_STRONG_INLINE const TensorCwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_EQ>, const Derived, const TensorCwiseNullaryOp<internal::scalar_constant_op<Scalar>, const Derived> >
570  operator==(Scalar threshold) const {
571  return operator==(constant(threshold));
572  }
573  EIGEN_DEVICE_FUNC
574  EIGEN_STRONG_INLINE const TensorCwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_NEQ>, const Derived, const TensorCwiseNullaryOp<internal::scalar_constant_op<Scalar>, const Derived> >
575  operator!=(Scalar threshold) const {
576  return operator!=(constant(threshold));
577  }
578 
579  // Checks
580  EIGEN_DEVICE_FUNC
581  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_isnan_op<Scalar>, const Derived>
582  (isnan)() const {
583  return unaryExpr(internal::scalar_isnan_op<Scalar>());
584  }
585  EIGEN_DEVICE_FUNC
586  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_isinf_op<Scalar>, const Derived>
587  (isinf)() const {
588  return unaryExpr(internal::scalar_isinf_op<Scalar>());
589  }
590  EIGEN_DEVICE_FUNC
591  EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_isfinite_op<Scalar>, const Derived>
592  (isfinite)() const {
593  return unaryExpr(internal::scalar_isfinite_op<Scalar>());
594  }
595 
596  // Coefficient-wise ternary operators.
597  template<typename ThenDerived, typename ElseDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
598  const TensorSelectOp<const Derived, const ThenDerived, const ElseDerived>
599  select(const ThenDerived& thenTensor, const ElseDerived& elseTensor) const {
600  return TensorSelectOp<const Derived, const ThenDerived, const ElseDerived>(derived(), thenTensor.derived(), elseTensor.derived());
601  }
602 
603  // Contractions.
604  typedef Eigen::IndexPair<Index> DimensionPair;
605 
606  template<typename OtherDerived, typename Dimensions> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
607  const TensorContractionOp<const Dimensions, const Derived, const OtherDerived, const NoOpOutputKernel>
608  contract(const OtherDerived& other, const Dimensions& dims) const {
609  return TensorContractionOp<const Dimensions, const Derived, const OtherDerived, const NoOpOutputKernel>(derived(), other.derived(), dims);
610  }
611 
612  template<typename OtherDerived, typename Dimensions, typename OutputKernel> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
613  const TensorContractionOp<const Dimensions, const Derived, const OtherDerived, const OutputKernel>
614  contract(const OtherDerived& other, const Dimensions& dims, const OutputKernel& output_kernel) const {
615  return TensorContractionOp<const Dimensions, const Derived, const OtherDerived, const OutputKernel>(derived(), other.derived(), dims, output_kernel);
616  }
617 
618  // Convolutions.
619  template<typename KernelDerived, typename Dimensions> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
620  const TensorConvolutionOp<const Dimensions, const Derived, const KernelDerived>
621  convolve(const KernelDerived& kernel, const Dimensions& dims) const {
622  return TensorConvolutionOp<const Dimensions, const Derived, const KernelDerived>(derived(), kernel.derived(), dims);
623  }
624 
625  // Fourier transforms
626  template <int FFTDataType, int FFTDirection, typename FFT> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
627  const TensorFFTOp<const FFT, const Derived, FFTDataType, FFTDirection>
628  fft(const FFT& dims) const {
629  return TensorFFTOp<const FFT, const Derived, FFTDataType, FFTDirection>(derived(), dims);
630  }
631 
632  // Scan.
633  typedef TensorScanOp<internal::SumReducer<CoeffReturnType>, const Derived> TensorScanSumOp;
634  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
635  const TensorScanSumOp
636  cumsum(const Index& axis, bool exclusive = false) const {
637  return TensorScanSumOp(derived(), axis, exclusive);
638  }
639 
640  typedef TensorScanOp<internal::ProdReducer<CoeffReturnType>, const Derived> TensorScanProdOp;
641  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
642  const TensorScanProdOp
643  cumprod(const Index& axis, bool exclusive = false) const {
644  return TensorScanProdOp(derived(), axis, exclusive);
645  }
646 
647  template <typename Reducer>
648  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
649  const TensorScanOp<Reducer, const Derived>
650  scan(const Index& axis, const Reducer& reducer, bool exclusive = false) const {
651  return TensorScanOp<Reducer, const Derived>(derived(), axis, exclusive, reducer);
652  }
653 
654  // Reductions.
655  template <typename Dims> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
656  const TensorReductionOp<internal::SumReducer<CoeffReturnType>, const Dims, const Derived>
657  sum(const Dims& dims) const {
658  return TensorReductionOp<internal::SumReducer<CoeffReturnType>, const Dims, const Derived>(derived(), dims, internal::SumReducer<CoeffReturnType>());
659  }
660 
661  const TensorReductionOp<internal::SumReducer<CoeffReturnType>, const DimensionList<Index, NumDimensions>, const Derived>
662  sum() const {
663  DimensionList<Index, NumDimensions> in_dims;
664  return TensorReductionOp<internal::SumReducer<CoeffReturnType>, const DimensionList<Index, NumDimensions>, const Derived>(derived(), in_dims, internal::SumReducer<CoeffReturnType>());
665  }
666 
667  template <typename Dims> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
668  const TensorReductionOp<internal::MeanReducer<CoeffReturnType>, const Dims, const Derived>
669  mean(const Dims& dims) const {
670  return TensorReductionOp<internal::MeanReducer<CoeffReturnType>, const Dims, const Derived>(derived(), dims, internal::MeanReducer<CoeffReturnType>());
671  }
672 
673  const TensorReductionOp<internal::MeanReducer<CoeffReturnType>, const DimensionList<Index, NumDimensions>, const Derived>
674  mean() const {
675  DimensionList<Index, NumDimensions> in_dims;
676  return TensorReductionOp<internal::MeanReducer<CoeffReturnType>, const DimensionList<Index, NumDimensions>, const Derived>(derived(), in_dims, internal::MeanReducer<CoeffReturnType>());
677  }
678 
679  template <typename Dims> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
680  const TensorReductionOp<internal::ProdReducer<CoeffReturnType>, const Dims, const Derived>
681  prod(const Dims& dims) const {
682  return TensorReductionOp<internal::ProdReducer<CoeffReturnType>, const Dims, const Derived>(derived(), dims, internal::ProdReducer<CoeffReturnType>());
683  }
684 
685  const TensorReductionOp<internal::ProdReducer<CoeffReturnType>, const DimensionList<Index, NumDimensions>, const Derived>
686  prod() const {
687  DimensionList<Index, NumDimensions> in_dims;
688  return TensorReductionOp<internal::ProdReducer<CoeffReturnType>, const DimensionList<Index, NumDimensions>, const Derived>(derived(), in_dims, internal::ProdReducer<CoeffReturnType>());
689  }
690 
691  template <typename Dims,int NanPropagation=PropagateFast> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
692  const TensorReductionOp<internal::MaxReducer<CoeffReturnType,NanPropagation>, const Dims, const Derived>
693  maximum(const Dims& dims) const {
694  return TensorReductionOp<internal::MaxReducer<CoeffReturnType,NanPropagation>, const Dims, const Derived>(derived(), dims, internal::MaxReducer<CoeffReturnType,NanPropagation>());
695  }
696 
697  template <int NanPropagation=PropagateFast>
698  const TensorReductionOp<internal::MaxReducer<CoeffReturnType,NanPropagation>, const DimensionList<Index, NumDimensions>, const Derived>
699  maximum() const {
700  DimensionList<Index, NumDimensions> in_dims;
701  return TensorReductionOp<internal::MaxReducer<CoeffReturnType,NanPropagation>, const DimensionList<Index, NumDimensions>, const Derived>(derived(), in_dims, internal::MaxReducer<CoeffReturnType,NanPropagation>());
702  }
703 
704  template <typename Dims,int NanPropagation=PropagateFast> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
705  const TensorReductionOp<internal::MinReducer<CoeffReturnType,NanPropagation>, const Dims, const Derived>
706  minimum(const Dims& dims) const {
707  return TensorReductionOp<internal::MinReducer<CoeffReturnType,NanPropagation>, const Dims, const Derived>(derived(), dims, internal::MinReducer<CoeffReturnType,NanPropagation>());
708  }
709 
710  template <int NanPropagation=PropagateFast>
711  const TensorReductionOp<internal::MinReducer<CoeffReturnType,NanPropagation>, const DimensionList<Index, NumDimensions>, const Derived>
712  minimum() const {
713  DimensionList<Index, NumDimensions> in_dims;
714  return TensorReductionOp<internal::MinReducer<CoeffReturnType,NanPropagation>, const DimensionList<Index, NumDimensions>, const Derived>(derived(), in_dims, internal::MinReducer<CoeffReturnType,NanPropagation>());
715  }
716 
717  template <typename Dims> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
718  const TensorReductionOp<internal::AndReducer, const Dims, const typename internal::conditional<internal::is_same<bool, CoeffReturnType>::value, Derived, TensorConversionOp<bool, const Derived> >::type >
719  all(const Dims& dims) const {
720  return cast<bool>().reduce(dims, internal::AndReducer());
721  }
722 
723  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
724  const TensorReductionOp<internal::AndReducer, const DimensionList<Index, NumDimensions>, const typename internal::conditional<internal::is_same<bool, CoeffReturnType>::value, Derived, TensorConversionOp<bool, const Derived> >::type >
725  all() const {
726  DimensionList<Index, NumDimensions> in_dims;
727  return cast<bool>().reduce(in_dims, internal::AndReducer());
728  }
729 
730  template <typename Dims> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
731  const TensorReductionOp<internal::OrReducer, const Dims, const typename internal::conditional<internal::is_same<bool, CoeffReturnType>::value, Derived, TensorConversionOp<bool, const Derived> >::type >
732  any(const Dims& dims) const {
733  return cast<bool>().reduce(dims, internal::OrReducer());
734  }
735 
736  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
737  const TensorReductionOp<internal::OrReducer, const DimensionList<Index, NumDimensions>, const typename internal::conditional<internal::is_same<bool, CoeffReturnType>::value, Derived, TensorConversionOp<bool, const Derived> >::type >
738  any() const {
739  DimensionList<Index, NumDimensions> in_dims;
740  return cast<bool>().reduce(in_dims, internal::OrReducer());
741  }
742 
743  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
744  const TensorTupleReducerOp<
745  internal::ArgMaxTupleReducer<Tuple<Index, CoeffReturnType> >,
746  const array<Index, NumDimensions>, const Derived>
747  argmax() const {
748  array<Index, NumDimensions> in_dims;
749  for (Index d = 0; d < NumDimensions; ++d) in_dims[d] = d;
750  return TensorTupleReducerOp<
751  internal::ArgMaxTupleReducer<Tuple<Index, CoeffReturnType> >,
752  const array<Index, NumDimensions>,
753  const Derived>(derived(), internal::ArgMaxTupleReducer<Tuple<Index, CoeffReturnType> >(), -1, in_dims);
754  }
755 
756  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
757  const TensorTupleReducerOp<
758  internal::ArgMinTupleReducer<Tuple<Index, CoeffReturnType> >,
759  const array<Index, NumDimensions>, const Derived>
760  argmin() const {
761  array<Index, NumDimensions> in_dims;
762  for (Index d = 0; d < NumDimensions; ++d) in_dims[d] = d;
763  return TensorTupleReducerOp<
764  internal::ArgMinTupleReducer<Tuple<Index, CoeffReturnType> >,
765  const array<Index, NumDimensions>,
766  const Derived>(derived(), internal::ArgMinTupleReducer<Tuple<Index, CoeffReturnType> >(), -1, in_dims);
767  }
768 
769  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
770  const TensorTupleReducerOp<
771  internal::ArgMaxTupleReducer<Tuple<Index, CoeffReturnType> >,
772  const array<Index, 1>, const Derived>
773  argmax(const Index return_dim) const {
774  array<Index, 1> in_dims;
775  in_dims[0] = return_dim;
776  return TensorTupleReducerOp<
777  internal::ArgMaxTupleReducer<Tuple<Index, CoeffReturnType> >,
778  const array<Index, 1>,
779  const Derived>(derived(), internal::ArgMaxTupleReducer<Tuple<Index, CoeffReturnType> >(), return_dim, in_dims);
780  }
781 
782  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
783  const TensorTupleReducerOp<
784  internal::ArgMinTupleReducer<Tuple<Index, CoeffReturnType> >,
785  const array<Index, 1>, const Derived>
786  argmin(const Index return_dim) const {
787  array<Index, 1> in_dims;
788  in_dims[0] = return_dim;
789  return TensorTupleReducerOp<
790  internal::ArgMinTupleReducer<Tuple<Index, CoeffReturnType> >,
791  const array<Index, 1>,
792  const Derived>(derived(), internal::ArgMinTupleReducer<Tuple<Index, CoeffReturnType> >(), return_dim, in_dims);
793  }
794 
795  template <typename Reducer, typename Dims> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
796  const TensorReductionOp<Reducer, const Dims, const Derived>
797  reduce(const Dims& dims, const Reducer& reducer) const {
798  return TensorReductionOp<Reducer, const Dims, const Derived>(derived(), dims, reducer);
799  }
800 
801  template <typename Dims> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
802  const TensorTraceOp<const Dims, const Derived>
803  trace(const Dims& dims) const {
804  return TensorTraceOp<const Dims, const Derived>(derived(), dims);
805  }
806 
807  const TensorTraceOp<const DimensionList<Index, NumDimensions>, const Derived>
808  trace() const {
809  DimensionList<Index, NumDimensions> in_dims;
810  return TensorTraceOp<const DimensionList<Index, NumDimensions>, const Derived>(derived(), in_dims);
811  }
812 
813  template <typename Broadcast> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
814  const TensorBroadcastingOp<const Broadcast, const Derived>
815  broadcast(const Broadcast& bcast) const {
816  return TensorBroadcastingOp<const Broadcast, const Derived>(derived(), bcast);
817  }
818 
819  template <typename Axis, typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
820  const TensorConcatenationOp<Axis, const Derived, const OtherDerived>
821  concatenate(const OtherDerived& other, Axis axis) const {
822  return TensorConcatenationOp<Axis, const Derived, const OtherDerived>(derived(), other.derived(), axis);
823  }
824 
825  template <typename PatchDims> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
826  const TensorPatchOp<const PatchDims, const Derived>
827  extract_patches(const PatchDims& patch_dims) const {
828  return TensorPatchOp<const PatchDims, const Derived>(derived(), patch_dims);
829  }
830 
831  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
832  const TensorImagePatchOp<Dynamic, Dynamic, const Derived>
833  extract_image_patches(const Index patch_rows = 1, const Index patch_cols = 1,
834  const Index row_stride = 1, const Index col_stride = 1,
835  const Index in_row_stride = 1, const Index in_col_stride = 1,
836  const PaddingType padding_type = PADDING_SAME, const Scalar padding_value = Scalar(0)) const {
837  return TensorImagePatchOp<Dynamic, Dynamic, const Derived>(derived(), patch_rows, patch_cols, row_stride, col_stride,
838  in_row_stride, in_col_stride, 1, 1, padding_type, padding_value);
839  }
840 
841  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
842  const TensorImagePatchOp<Dynamic, Dynamic, const Derived>
843  extract_image_patches(const Index patch_rows, const Index patch_cols,
844  const Index row_stride, const Index col_stride,
845  const Index in_row_stride, const Index in_col_stride,
846  const Index row_inflate_stride, const Index col_inflate_stride,
847  const Index padding_top, const Index padding_bottom,
848  const Index padding_left,const Index padding_right,
849  const Scalar padding_value) const {
850  return TensorImagePatchOp<Dynamic, Dynamic, const Derived>(derived(), patch_rows, patch_cols, row_stride, col_stride,
851  in_row_stride, in_col_stride, row_inflate_stride, col_inflate_stride,
852  padding_top, padding_bottom, padding_left, padding_right, padding_value);
853  }
854 
855  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
856  const TensorVolumePatchOp<Dynamic, Dynamic, Dynamic, const Derived>
857  extract_volume_patches(const Index patch_planes, const Index patch_rows, const Index patch_cols,
858  const Index plane_stride = 1, const Index row_stride = 1, const Index col_stride = 1,
859  const PaddingType padding_type = PADDING_SAME, const Scalar padding_value = Scalar(0)) const {
860  return TensorVolumePatchOp<Dynamic, Dynamic, Dynamic, const Derived>(derived(), patch_planes, patch_rows, patch_cols, plane_stride, row_stride, col_stride, 1, 1, 1, 1, 1, 1, padding_type, padding_value);
861  }
862 
863 
864  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
865  const TensorVolumePatchOp<Dynamic, Dynamic, Dynamic, const Derived>
866  extract_volume_patches(const Index patch_planes, const Index patch_rows, const Index patch_cols,
867  const Index plane_stride, const Index row_stride, const Index col_stride,
868  const Index plane_inflate_stride, const Index row_inflate_stride, const Index col_inflate_stride,
869  const Index padding_top_z, const Index padding_bottom_z,
870  const Index padding_top, const Index padding_bottom,
871  const Index padding_left, const Index padding_right, const Scalar padding_value = Scalar(0)) const {
872  return TensorVolumePatchOp<Dynamic, Dynamic, Dynamic, const Derived>(derived(), patch_planes, patch_rows, patch_cols, plane_stride, row_stride, col_stride, 1, 1, 1, plane_inflate_stride, row_inflate_stride, col_inflate_stride, padding_top_z, padding_bottom_z, padding_top, padding_bottom, padding_left, padding_right, padding_value);
873  }
874 
875  // Morphing operators.
876  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
877  const TensorLayoutSwapOp<const Derived>
878  swap_layout() const {
879  return TensorLayoutSwapOp<const Derived>(derived());
880  }
881  template <typename NewDimensions> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
882  const TensorReshapingOp<const NewDimensions, const Derived>
883  reshape(const NewDimensions& newDimensions) const {
884  return TensorReshapingOp<const NewDimensions, const Derived>(derived(), newDimensions);
885  }
886  template <typename StartIndices, typename Sizes> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
887  const TensorSlicingOp<const StartIndices, const Sizes, const Derived>
888  slice(const StartIndices& startIndices, const Sizes& sizes) const {
889  return TensorSlicingOp<const StartIndices, const Sizes, const Derived>(derived(), startIndices, sizes);
890  }
891  template <typename StartIndices, typename StopIndices, typename Strides> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
892  const TensorStridingSlicingOp<const StartIndices, const StopIndices, const Strides, const Derived>
893  stridedSlice(const StartIndices& startIndices, const StopIndices& stopIndices, const Strides& strides) const {
894  return TensorStridingSlicingOp<const StartIndices, const StopIndices, const Strides,
895  const Derived>(derived(), startIndices, stopIndices, strides);
896  }
897  template <Index DimId> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
898  const TensorChippingOp<DimId, const Derived>
899  chip(const Index offset) const {
900  return TensorChippingOp<DimId, const Derived>(derived(), offset, DimId);
901  }
902  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
903  const TensorChippingOp<Dynamic, const Derived>
904  chip(const Index offset, const Index dim) const {
905  return TensorChippingOp<Dynamic, const Derived>(derived(), offset, dim);
906  }
907  template <typename ReverseDimensions> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
908  const TensorReverseOp<const ReverseDimensions, const Derived>
909  reverse(const ReverseDimensions& rev) const {
910  return TensorReverseOp<const ReverseDimensions, const Derived>(derived(), rev);
911  }
912  template <typename PaddingDimensions> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
913  const TensorPaddingOp<const PaddingDimensions, const Derived>
914  pad(const PaddingDimensions& padding) const {
915  return TensorPaddingOp<const PaddingDimensions, const Derived>(derived(), padding, internal::scalar_cast_op<int, Scalar>()(0));
916  }
917  template <typename PaddingDimensions> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
918  const TensorPaddingOp<const PaddingDimensions, const Derived>
919  pad(const PaddingDimensions& padding, const Scalar padding_value) const {
920  return TensorPaddingOp<const PaddingDimensions, const Derived>(derived(), padding, padding_value);
921  }
922  template <typename Shuffle> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
923  const TensorShufflingOp<const Shuffle, const Derived>
924  shuffle(const Shuffle& shfl) const {
925  return TensorShufflingOp<const Shuffle, const Derived>(derived(), shfl);
926  }
927  template <typename Strides> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
928  const TensorStridingOp<const Strides, const Derived>
929  stride(const Strides& strides) const {
930  return TensorStridingOp<const Strides, const Derived>(derived(), strides);
931  }
932  template <typename Strides> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
933  const TensorInflationOp<const Strides, const Derived>
934  inflate(const Strides& strides) const {
935  return TensorInflationOp<const Strides, const Derived>(derived(), strides);
936  }
937 
938  // Returns a tensor containing index/value tuples
939  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
940  const TensorIndexTupleOp<const Derived>
941  index_tuples() const {
942  return TensorIndexTupleOp<const Derived>(derived());
943  }
944 
945  // Support for custom unary and binary operations
946  template <typename CustomUnaryFunc>
947  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
948  const TensorCustomUnaryOp<const CustomUnaryFunc, const Derived> customOp(const CustomUnaryFunc& op) const {
949  return TensorCustomUnaryOp<const CustomUnaryFunc, const Derived>(derived(), op);
950  }
951  template <typename OtherDerived, typename CustomBinaryFunc>
952  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
953  const TensorCustomBinaryOp<const CustomBinaryFunc, const Derived, const OtherDerived> customOp(const OtherDerived& other, const CustomBinaryFunc& op) const {
954  return TensorCustomBinaryOp<const CustomBinaryFunc, const Derived, const OtherDerived>(derived(), other, op);
955  }
956 
957  // Force the evaluation of the expression.
958  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
959  const TensorForcedEvalOp<const Derived> eval() const {
960  return TensorForcedEvalOp<const Derived>(derived());
961  }
962 
963  protected:
964  template <typename Scalar, int NumIndices, int Options, typename IndexType> friend class Tensor;
965  template <typename Scalar, typename Dimensions, int Option, typename IndexTypes> friend class TensorFixedSize;
966  // the Eigen:: prefix is required to workaround a compilation issue with nvcc 9.0
967  template <typename OtherDerived, int AccessLevel> friend class Eigen::TensorBase;
968  EIGEN_DEVICE_FUNC
969  EIGEN_STRONG_INLINE const Derived& derived() const { return *static_cast<const Derived*>(this); }
970 };
971 
972 template<typename Derived, int AccessLevel = internal::accessors_level<Derived>::value>
973 class TensorBase : public TensorBase<Derived, ReadOnlyAccessors> {
974  public:
975  typedef TensorBase<Derived, ReadOnlyAccessors> Base;
976  typedef internal::traits<Derived> DerivedTraits;
977  typedef typename DerivedTraits::Scalar Scalar;
978  typedef typename DerivedTraits::Index Index;
979  typedef Scalar CoeffReturnType;
980  static const int NumDimensions = DerivedTraits::NumDimensions;
981 
982  template <typename Scalar, int NumIndices, int Options, typename IndexType> friend class Tensor;
983  template <typename Scalar, typename Dimensions, int Option, typename IndexTypes> friend class TensorFixedSize;
984  // the Eigen:: prefix is required to workaround a compilation issue with nvcc 9.0
985  template <typename OtherDerived, int OtherAccessLevel> friend class Eigen::TensorBase;
986 
987  EIGEN_DEVICE_FUNC
988  EIGEN_STRONG_INLINE Derived& setZero() {
989  return setConstant(Scalar(0));
990  }
991  EIGEN_DEVICE_FUNC
992  EIGEN_STRONG_INLINE Derived& setConstant(const Scalar& val) {
993  return derived() = this->constant(val);
994  }
995  EIGEN_DEVICE_FUNC
996  EIGEN_STRONG_INLINE Derived& setRandom() {
997  return derived() = this->random();
998  }
999  template <typename RandomGenerator> EIGEN_DEVICE_FUNC
1000  EIGEN_STRONG_INLINE Derived& setRandom() {
1001  return derived() = this->template random<RandomGenerator>();
1002  }
1003 
1004 #if EIGEN_HAS_VARIADIC_TEMPLATES
1005  EIGEN_DEVICE_FUNC
1006  EIGEN_STRONG_INLINE Derived& setValues(
1007  const typename internal::Initializer<Derived, NumDimensions>::InitList& vals) {
1008  TensorEvaluator<Derived, DefaultDevice> eval(derived(), DefaultDevice());
1009  internal::initialize_tensor<Derived, NumDimensions>(eval, vals);
1010  return derived();
1011  }
1012 #endif // EIGEN_HAS_VARIADIC_TEMPLATES
1013 
1014  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1015  Derived& operator+=(const OtherDerived& other) {
1016  return derived() = derived() + other.derived();
1017  }
1018  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1019  Derived& operator-=(const OtherDerived& other) {
1020  return derived() = derived() - other.derived();
1021  }
1022  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1023  Derived& operator*=(const OtherDerived& other) {
1024  return derived() = derived() * other.derived();
1025  }
1026  template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1027  Derived& operator/=(const OtherDerived& other) {
1028  return derived() = derived() / other.derived();
1029  }
1030 
1031  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1032  const TensorLayoutSwapOp<const Derived>
1033  swap_layout() const {
1034  return TensorLayoutSwapOp<const Derived>(derived());
1035  }
1036  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1037  TensorLayoutSwapOp<Derived>
1038  swap_layout() {
1039  return TensorLayoutSwapOp<Derived>(derived());
1040  }
1041 
1042  template <typename Axis, typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1043  const TensorConcatenationOp<const Axis, const Derived, const OtherDerived>
1044  concatenate(const OtherDerived& other, const Axis& axis) const {
1045  return TensorConcatenationOp<const Axis, const Derived, const OtherDerived>(derived(), other, axis);
1046  }
1047  template <typename Axis, typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1048  TensorConcatenationOp<const Axis, Derived, OtherDerived>
1049  concatenate(const OtherDerived& other, const Axis& axis) {
1050  return TensorConcatenationOp<const Axis, Derived, OtherDerived>(derived(), other, axis);
1051  }
1052 
1053  template <typename NewDimensions> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1054  const TensorReshapingOp<const NewDimensions, const Derived>
1055  reshape(const NewDimensions& newDimensions) const {
1056  return TensorReshapingOp<const NewDimensions, const Derived>(derived(), newDimensions);
1057  }
1058  template <typename NewDimensions> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1059  TensorReshapingOp<const NewDimensions, Derived>
1060  reshape(const NewDimensions& newDimensions) {
1061  return TensorReshapingOp<const NewDimensions, Derived>(derived(), newDimensions);
1062  }
1063 
1064  template <typename StartIndices, typename Sizes> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1065  const TensorSlicingOp<const StartIndices, const Sizes, const Derived>
1066  slice(const StartIndices& startIndices, const Sizes& sizes) const {
1067  return TensorSlicingOp<const StartIndices, const Sizes, const Derived>(derived(), startIndices, sizes);
1068  }
1069  template <typename StartIndices, typename Sizes> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1070  TensorSlicingOp<const StartIndices, const Sizes, Derived>
1071  slice(const StartIndices& startIndices, const Sizes& sizes) {
1072  return TensorSlicingOp<const StartIndices, const Sizes, Derived>(derived(), startIndices, sizes);
1073  }
1074 
1075  template <typename StartIndices, typename StopIndices, typename Strides> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1076  const TensorStridingSlicingOp<const StartIndices, const StopIndices, const Strides, const Derived>
1077  stridedSlice(const StartIndices& startIndices, const StopIndices& stopIndices, const Strides& strides) const {
1078  return TensorStridingSlicingOp<const StartIndices, const StopIndices, const Strides,
1079  const Derived>(derived(), startIndices, stopIndices, strides);
1080  }
1081  template <typename StartIndices, typename StopIndices, typename Strides> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1082  TensorStridingSlicingOp<const StartIndices, const StopIndices, const Strides, Derived>
1083  stridedSlice(const StartIndices& startIndices, const StopIndices& stopIndices, const Strides& strides) {
1084  return TensorStridingSlicingOp<const StartIndices, const StopIndices, const Strides,
1085  Derived>(derived(), startIndices, stopIndices, strides);
1086  }
1087 
1088  template <DenseIndex DimId> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1089  const TensorChippingOp<DimId, const Derived>
1090  chip(const Index offset) const {
1091  return TensorChippingOp<DimId, const Derived>(derived(), offset, DimId);
1092  }
1093  template <Index DimId> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1094  TensorChippingOp<DimId, Derived>
1095  chip(const Index offset) {
1096  return TensorChippingOp<DimId, Derived>(derived(), offset, DimId);
1097  }
1098 
1099  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1100  const TensorChippingOp<Dynamic, const Derived>
1101  chip(const Index offset, const Index dim) const {
1102  return TensorChippingOp<Dynamic, const Derived>(derived(), offset, dim);
1103  }
1104  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1105  TensorChippingOp<Dynamic, Derived>
1106  chip(const Index offset, const Index dim) {
1107  return TensorChippingOp<Dynamic, Derived>(derived(), offset, dim);
1108  }
1109 
1110  template <typename ReverseDimensions> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1111  const TensorReverseOp<const ReverseDimensions, const Derived>
1112  reverse(const ReverseDimensions& rev) const {
1113  return TensorReverseOp<const ReverseDimensions, const Derived>(derived(), rev);
1114  }
1115  template <typename ReverseDimensions> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1116  TensorReverseOp<const ReverseDimensions, Derived>
1117  reverse(const ReverseDimensions& rev) {
1118  return TensorReverseOp<const ReverseDimensions, Derived>(derived(), rev);
1119  }
1120 
1121  template <typename Shuffle> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1122  const TensorShufflingOp<const Shuffle, const Derived>
1123  shuffle(const Shuffle& shfl) const {
1124  return TensorShufflingOp<const Shuffle, const Derived>(derived(), shfl);
1125  }
1126  template <typename Shuffle> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1127  TensorShufflingOp<const Shuffle, Derived>
1128  shuffle(const Shuffle& shfl) {
1129  return TensorShufflingOp<const Shuffle, Derived>(derived(), shfl);
1130  }
1131 
1132  template <typename Strides> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1133  const TensorStridingOp<const Strides, const Derived>
1134  stride(const Strides& strides) const {
1135  return TensorStridingOp<const Strides, const Derived>(derived(), strides);
1136  }
1137  template <typename Strides> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1138  TensorStridingOp<const Strides, Derived>
1139  stride(const Strides& strides) {
1140  return TensorStridingOp<const Strides, Derived>(derived(), strides);
1141  }
1142 
1143  // Select the device on which to evaluate the expression.
1144  template <typename DeviceType>
1145  TensorDevice<Derived, DeviceType> device(const DeviceType& dev) {
1146  return TensorDevice<Derived, DeviceType>(dev, derived());
1147  }
1148 
1149  // Select the async device on which to evaluate the expression.
1150  template <typename DeviceType, typename DoneCallback>
1151  TensorAsyncDevice<Derived, DeviceType, DoneCallback> device(const DeviceType& dev, DoneCallback done) {
1152  return TensorAsyncDevice<Derived, DeviceType, DoneCallback>(dev, derived(), std::move(done));
1153  }
1154 
1155  protected:
1156  EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(TensorBase)
1157  EIGEN_DEFAULT_COPY_CONSTRUCTOR(TensorBase)
1158 
1159  template<typename OtherDerived> EIGEN_DEVICE_FUNC
1160  EIGEN_STRONG_INLINE Derived& operator=(const OtherDerived& other)
1161  {
1162  typedef TensorAssignOp<Derived, const OtherDerived> Assign;
1163  Assign assign(derived(), other.derived());
1164  internal::TensorExecutor<const Assign, DefaultDevice>::run(assign, DefaultDevice());
1165  return derived();
1166  }
1167 
1168  EIGEN_DEVICE_FUNC
1169  EIGEN_STRONG_INLINE Derived& derived() { return *static_cast<Derived*>(this); }
1170  EIGEN_DEVICE_FUNC
1171  EIGEN_STRONG_INLINE const Derived& derived() const { return *static_cast<const Derived*>(this); }
1172 };
1173 #endif // EIGEN_PARSED_BY_DOXYGEN
1174 } // end namespace Eigen
1175 
1176 #endif // EIGEN_CXX11_TENSOR_TENSOR_BASE_H
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_tanh_op< typename Derived::Scalar >, const Derived > tanh(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_y1_op< typename Derived::Scalar >, const Derived > bessel_y1(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:278
static const Eigen::internal::all_t all
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_isfinite_op< typename Derived::Scalar >, const Derived > isfinite(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_j0_op< typename Derived::Scalar >, const Derived > bessel_j0(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:212
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_sqrt_op< typename Derived::Scalar >, const Derived > sqrt(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_j1_op< typename Derived::Scalar >, const Derived > bessel_j1(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:256
const Eigen::CwiseBinaryOp< Eigen::internal::scalar_igamma_der_a_op< typename Derived::Scalar >, const Derived, const ExponentDerived > igamma_der_a(const Eigen::ArrayBase< Derived > &a, const Eigen::ArrayBase< ExponentDerived > &x)
Definition: SpecialFunctionsArrayAPI.h:51
Namespace containing all symbols from the Eigen library.
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_ndtri_op< typename Derived::Scalar >, const Derived > ndtri(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_square_op< typename Derived::Scalar >, const Derived > square(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_lgamma_op< typename Derived::Scalar >, const Derived > lgamma(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_erf_op< typename Derived::Scalar >, const Derived > erf(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseBinaryOp< Eigen::internal::scalar_igammac_op< typename Derived::Scalar >, const Derived, const ExponentDerived > igammac(const Eigen::ArrayBase< Derived > &a, const Eigen::ArrayBase< ExponentDerived > &x)
Definition: SpecialFunctionsArrayAPI.h:90
const Eigen::CwiseBinaryOp< Eigen::internal::scalar_igamma_op< typename Derived::Scalar >, const Derived, const ExponentDerived > igamma(const Eigen::ArrayBase< Derived > &a, const Eigen::ArrayBase< ExponentDerived > &x)
Definition: SpecialFunctionsArrayAPI.h:28
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_erfc_op< typename Derived::Scalar >, const Derived > erfc(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_ceil_op< typename Derived::Scalar >, const Derived > ceil(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_i0_op< typename Derived::Scalar >, const Derived > bessel_i0(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:32
ReadOnlyAccessors
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_inverse_op< typename Derived::Scalar >, const Derived > inverse(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseBinaryOp< Eigen::internal::scalar_gamma_sample_der_alpha_op< typename AlphaDerived::Scalar >, const AlphaDerived, const SampleDerived > gamma_sample_der_alpha(const Eigen::ArrayBase< AlphaDerived > &alpha, const Eigen::ArrayBase< SampleDerived > &sample)
Definition: SpecialFunctionsArrayAPI.h:72
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_isnan_op< typename Derived::Scalar >, const Derived > isnan(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_imag_op< typename Derived::Scalar >, const Derived > imag(const Eigen::ArrayBase< Derived > &x)
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_round_op< typename Derived::Scalar >, const Derived > round(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_rint_op< typename Derived::Scalar >, const Derived > rint(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_digamma_op< typename Derived::Scalar >, const Derived > digamma(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_floor_op< typename Derived::Scalar >, const Derived > floor(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_i0e_op< typename Derived::Scalar >, const Derived > bessel_i0e(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:55
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_k1e_op< typename Derived::Scalar >, const Derived > bessel_k1e(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:190
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_log1p_op< typename Derived::Scalar >, const Derived > log1p(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_isinf_op< typename Derived::Scalar >, const Derived > isinf(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_real_op< typename Derived::Scalar >, const Derived > real(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_rsqrt_op< typename Derived::Scalar >, const Derived > rsqrt(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_y0_op< typename Derived::Scalar >, const Derived > bessel_y0(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:234
The tensor base class.
Definition: TensorForwardDeclarations.h:56
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_cube_op< typename Derived::Scalar >, const Derived > cube(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_abs_op< typename Derived::Scalar >, const Derived > abs(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_log_op< typename Derived::Scalar >, const Derived > log(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_k1_op< typename Derived::Scalar >, const Derived > bessel_k1(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:167
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_expm1_op< typename Derived::Scalar >, const Derived > expm1(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseBinaryOp< Eigen::internal::scalar_zeta_op< typename DerivedX::Scalar >, const DerivedX, const DerivedQ > zeta(const Eigen::ArrayBase< DerivedX > &x, const Eigen::ArrayBase< DerivedQ > &q)
Definition: SpecialFunctionsArrayAPI.h:156
const Eigen::CwiseBinaryOp< Eigen::internal::scalar_polygamma_op< typename DerivedX::Scalar >, const DerivedN, const DerivedX > polygamma(const Eigen::ArrayBase< DerivedN > &n, const Eigen::ArrayBase< DerivedX > &x)
Definition: SpecialFunctionsArrayAPI.h:112
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_i1e_op< typename Derived::Scalar >, const Derived > bessel_i1e(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:100
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_k0_op< typename Derived::Scalar >, const Derived > bessel_k0(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:122
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_log2_op< typename Derived::Scalar >, const Derived > log2(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_i1_op< typename Derived::Scalar >, const Derived > bessel_i1(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:77
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_sign_op< typename Derived::Scalar >, const Derived > sign(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_exp_op< typename Derived::Scalar >, const Derived > exp(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_bessel_k0e_op< typename Derived::Scalar >, const Derived > bessel_k0e(const Eigen::ArrayBase< Derived > &x)
Definition: BesselFunctionsArrayAPI.h:145
const Product< SparseDerived, PermDerived, AliasFreeProduct > operator*(const SparseMatrixBase< SparseDerived > &matrix, const PermutationBase< PermDerived > &perm)