aboutsummaryrefslogtreecommitdiffhomepage
path: root/unsupported/Eigen/CXX11/src/Tensor/TensorFunctors.h
diff options
context:
space:
mode:
authorGravatar Benoit Steiner <benoit.steiner.goog@gmail.com>2014-10-01 20:38:22 -0700
committerGravatar Benoit Steiner <benoit.steiner.goog@gmail.com>2014-10-01 20:38:22 -0700
commit7caaf6453b7b1f58d953729380d596b2d9b27835 (patch)
tree59003efb25e7119af4da63b0371efb53daddbcf8 /unsupported/Eigen/CXX11/src/Tensor/TensorFunctors.h
parent1c236f4c9ae78cc58156eebe3b2bb43588897af4 (diff)
Added support for tensor reductions and concatenations
Diffstat (limited to 'unsupported/Eigen/CXX11/src/Tensor/TensorFunctors.h')
-rw-r--r--unsupported/Eigen/CXX11/src/Tensor/TensorFunctors.h62
1 files changed, 62 insertions, 0 deletions
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorFunctors.h b/unsupported/Eigen/CXX11/src/Tensor/TensorFunctors.h
new file mode 100644
index 000000000..92984336c
--- /dev/null
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorFunctors.h
@@ -0,0 +1,62 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2014 Benoit Steiner <benoit.steiner.goog@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_CXX11_TENSOR_TENSOR_FUNCTORS_H
+#define EIGEN_CXX11_TENSOR_TENSOR_FUNCTORS_H
+
+namespace Eigen {
+namespace internal {
+
+// Standard reduction functors
+template <typename T> struct SumReducer
+{
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE SumReducer() : m_sum(0) { }
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t) {
+ m_sum += t;
+ }
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize() const {
+ return m_sum;
+ }
+
+ private:
+ T m_sum;
+};
+
+template <typename T> struct MaxReducer
+{
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE MaxReducer() : m_max((std::numeric_limits<T>::min)()) { }
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t) {
+ if (t > m_max) { m_max = t; }
+ }
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize() const {
+ return m_max;
+ }
+
+ private:
+ T m_max;
+};
+
+template <typename T> struct MinReducer
+{
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE MinReducer() : m_min((std::numeric_limits<T>::max)()) { }
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t) {
+ if (t < m_min) { m_min = t; }
+ }
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize() const {
+ return m_min;
+ }
+
+ private:
+ T m_min;
+};
+
+} // end namespace internal
+} // end namespace Eigen
+
+#endif // EIGEN_CXX11_TENSOR_TENSOR_FUNCTORS_H