12b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// This file is part of Eigen, a lightweight C++ template library
22b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// for linear algebra.
32b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//
42b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Copyright (C) 2014 Benoit Steiner <benoit.steiner.goog@gmail.com>
52b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//
62b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// This Source Code Form is subject to the terms of the Mozilla
72b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Public License v. 2.0. If a copy of the MPL was not distributed
82b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
92b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#ifndef EIGEN_CXX11_TENSOR_TENSOR_BASE_H
112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#define EIGEN_CXX11_TENSOR_TENSOR_BASE_H
122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// clang-format off
142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace Eigen {
162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/** \class TensorBase
182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \ingroup CXX11_Tensor_Module
192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \brief The tensor base class.
212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * This class is the common parent of the Tensor and TensorMap class, thus
232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * making it possible to use either class interchangably in expressions.
242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  */
252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Derived>
272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangclass TensorBase<Derived, ReadOnlyAccessors>
282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  public:
302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef internal::traits<Derived> DerivedTraits;
312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename DerivedTraits::Scalar Scalar;
322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename DerivedTraits::Index Index;
332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename internal::remove_const<Scalar>::type CoeffReturnType;
342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    static const int NumDimensions = DerivedTraits::NumDimensions;
352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Generic nullary operation support.
372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename CustomNullaryOp> EIGEN_DEVICE_FUNC
382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseNullaryOp<CustomNullaryOp, const Derived>
392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    nullaryExpr(const CustomNullaryOp& func) const {
402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorCwiseNullaryOp<CustomNullaryOp, const Derived>(derived(), func);
412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Coefficient-wise nullary operators
442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseNullaryOp<internal::scalar_constant_op<Scalar>, const Derived>
462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    constant(const Scalar& value) const {
472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return nullaryExpr(internal::scalar_constant_op<Scalar>(value));
482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseNullaryOp<internal::UniformRandomGenerator<Scalar>, const Derived>
522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    random() const {
532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return nullaryExpr(internal::UniformRandomGenerator<Scalar>());
542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename RandomGenerator> EIGEN_DEVICE_FUNC
562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseNullaryOp<RandomGenerator, const Derived>
572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    random(const RandomGenerator& gen = RandomGenerator()) const {
582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return nullaryExpr(gen);
592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Tensor generation
622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Generator> EIGEN_DEVICE_FUNC
632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorGeneratorOp<Generator, const Derived>
642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    generate(const Generator& generator) const {
652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorGeneratorOp<Generator, const Derived>(derived(), generator);
662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Generic unary operation support.
692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename CustomUnaryOp> EIGEN_DEVICE_FUNC
702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<CustomUnaryOp, const Derived>
712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    unaryExpr(const CustomUnaryOp& func) const {
722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorCwiseUnaryOp<CustomUnaryOp, const Derived>(derived(), func);
732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Coefficient-wise unary operators
762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const Derived>
782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator-() const {
792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_opposite_op<Scalar>());
802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_sqrt_op<Scalar>, const Derived>
842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    sqrt() const {
852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_sqrt_op<Scalar>());
862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_sign_op<Scalar>, const Derived>
902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    sign() const {
912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_sign_op<Scalar>());
922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_rsqrt_op<Scalar>, const Derived>
962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    rsqrt() const {
972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_rsqrt_op<Scalar>());
982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
1012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_square_op<Scalar>, const Derived>
1022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    square() const {
1032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_square_op<Scalar>());
1042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
1052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
1072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_cube_op<Scalar>, const Derived>
1082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    cube() const {
1092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_cube_op<Scalar>());
1102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
1112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
1132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_inverse_op<Scalar>, const Derived>
1142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inverse() const {
1152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_inverse_op<Scalar>());
1162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
1172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
1192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_tanh_op<Scalar>, const Derived>
1202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    tanh() const {
1212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_tanh_op<Scalar>());
1222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
1232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
1252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_lgamma_op<Scalar>, const Derived>
1262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    lgamma() const {
1272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_lgamma_op<Scalar>());
1282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
1292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
1312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_digamma_op<Scalar>, const Derived>
1322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    digamma() const {
1332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_digamma_op<Scalar>());
1342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
1352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // igamma(a = this, x = other)
1372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseBinaryOp<internal::scalar_igamma_op<Scalar>, const Derived, const OtherDerived>
1392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    igamma(const OtherDerived& other) const {
1402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return binaryExpr(other.derived(), internal::scalar_igamma_op<Scalar>());
1412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
1422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // igammac(a = this, x = other)
1442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseBinaryOp<internal::scalar_igammac_op<Scalar>, const Derived, const OtherDerived>
1462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    igammac(const OtherDerived& other) const {
1472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return binaryExpr(other.derived(), internal::scalar_igammac_op<Scalar>());
1482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
1492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // zeta(x = this, q = other)
1512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseBinaryOp<internal::scalar_zeta_op<Scalar>, const Derived, const OtherDerived>
1532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    zeta(const OtherDerived& other) const {
1542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return binaryExpr(other.derived(), internal::scalar_zeta_op<Scalar>());
1552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
1562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // polygamma(n = this, x = other)
1582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseBinaryOp<internal::scalar_polygamma_op<Scalar>, const Derived, const OtherDerived>
1602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    polygamma(const OtherDerived& other) const {
1612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return binaryExpr(other.derived(), internal::scalar_polygamma_op<Scalar>());
1622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
1632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
1652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_erf_op<Scalar>, const Derived>
1662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    erf() const {
1672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_erf_op<Scalar>());
1682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
1692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
1712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_erfc_op<Scalar>, const Derived>
1722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    erfc() const {
1732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_erfc_op<Scalar>());
1742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
1752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
1772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_sigmoid_op<Scalar>, const Derived>
1782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    sigmoid() const {
1792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_sigmoid_op<Scalar>());
1802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
1812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
1832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_exp_op<Scalar>, const Derived>
1842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    exp() const {
1852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_exp_op<Scalar>());
1862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
1872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
1892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_log_op<Scalar>, const Derived>
1902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    log() const {
1912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_log_op<Scalar>());
1922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
1932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
1952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_log1p_op<Scalar>, const Derived>
1962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    log1p() const {
1972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_log1p_op<Scalar>());
1982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
1992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_abs_op<Scalar>, const Derived>
2022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    abs() const {
2032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_abs_op<Scalar>());
2042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
2052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, const Derived>
2082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    conjugate() const {
2092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_conjugate_op<Scalar>());
2102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
2112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::bind2nd_op<internal::scalar_pow_op<Scalar,Scalar> >, const Derived>
2142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    pow(Scalar exponent) const {
2152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::bind2nd_op<internal::scalar_pow_op<Scalar,Scalar> >(exponent));
2162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
2172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_real_op<Scalar>, const Derived>
2202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    real() const {
2212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_real_op<Scalar>());
2222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
2232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_imag_op<Scalar>, const Derived>
2262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    imag() const {
2272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_imag_op<Scalar>());
2282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
2292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::bind2nd_op<internal::scalar_sum_op<Scalar,Scalar> >, const Derived>
2322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator+ (Scalar rhs) const {
2332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::bind2nd_op<internal::scalar_sum_op<Scalar,Scalar> >(rhs));
2342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
2352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE friend
2382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseUnaryOp<internal::bind1st_op<internal::scalar_sum_op<Scalar> >, const Derived>
2392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator+ (Scalar lhs, const Derived& rhs) {
2402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return rhs.unaryExpr(internal::bind1st_op<internal::scalar_sum_op<Scalar> >(lhs));
2412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
2422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::bind2nd_op<internal::scalar_difference_op<Scalar,Scalar> >, const Derived>
2452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator- (Scalar rhs) const {
2462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      EIGEN_STATIC_ASSERT((NumTraits<Scalar>::IsSigned || internal::is_same<Scalar, const std::complex<float> >::value), YOU_MADE_A_PROGRAMMING_MISTAKE);
2472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::bind2nd_op<internal::scalar_difference_op<Scalar,Scalar> >(rhs));
2482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
2492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE friend
2522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseUnaryOp<internal::bind1st_op<internal::scalar_difference_op<Scalar> >, const Derived>
2532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator- (Scalar lhs, const Derived& rhs) {
2542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return rhs.unaryExpr(internal::bind1st_op<internal::scalar_difference_op<Scalar> >(lhs));
2552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
2562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::bind2nd_op<internal::scalar_product_op<Scalar,Scalar> >, const Derived>
2592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator* (Scalar rhs) const {
2602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::bind2nd_op<internal::scalar_product_op<Scalar,Scalar> >(rhs));
2612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
2622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE friend
2652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseUnaryOp<internal::bind1st_op<internal::scalar_product_op<Scalar> >, const Derived>
2662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator* (Scalar lhs, const Derived& rhs) {
2672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return rhs.unaryExpr(internal::bind1st_op<internal::scalar_product_op<Scalar> >(lhs));
2682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
2692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::bind2nd_op<internal::scalar_quotient_op<Scalar,Scalar> >, const Derived>
2722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator/ (Scalar rhs) const {
2732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::bind2nd_op<internal::scalar_quotient_op<Scalar,Scalar> >(rhs));
2742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
2752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE friend
2782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseUnaryOp<internal::bind1st_op<internal::scalar_quotient_op<Scalar> >, const Derived>
2792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator/ (Scalar lhs, const Derived& rhs) {
2802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return rhs.unaryExpr(internal::bind1st_op<internal::scalar_quotient_op<Scalar> >(lhs));
2812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
2822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_mod_op<Scalar>, const Derived>
2852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator% (Scalar rhs) const {
2862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      EIGEN_STATIC_ASSERT(NumTraits<Scalar>::IsInteger, YOU_MADE_A_PROGRAMMING_MISTAKE_TRY_MOD);
2872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_mod_op<Scalar>(rhs));
2882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
2892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseBinaryOp<internal::scalar_max_op<Scalar>, const Derived, const TensorCwiseNullaryOp<internal::scalar_constant_op<Scalar>, const Derived> >
2922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    cwiseMax(Scalar threshold) const {
2932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return cwiseMax(constant(threshold));
2942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
2952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseBinaryOp<internal::scalar_min_op<Scalar>, const Derived, const TensorCwiseNullaryOp<internal::scalar_constant_op<Scalar>, const Derived> >
2982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    cwiseMin(Scalar threshold) const {
2992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return cwiseMin(constant(threshold));
3002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
3012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename NewType> EIGEN_DEVICE_FUNC
3032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorConversionOp<NewType, const Derived>
3042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    cast() const {
3052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorConversionOp<NewType, const Derived>(derived());
3062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
3072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
3092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_round_op<Scalar>, const Derived>
3102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    round() const {
3112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_round_op<Scalar>());
3122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
3132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
3152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_ceil_op<Scalar>, const Derived>
3162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    ceil() const {
3172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_ceil_op<Scalar>());
3182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
3192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
3212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_floor_op<Scalar>, const Derived>
3222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    floor() const {
3232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_floor_op<Scalar>());
3242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
3252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Generic binary operation support.
3272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename CustomBinaryOp, typename OtherDerived> EIGEN_DEVICE_FUNC
3282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseBinaryOp<CustomBinaryOp, const Derived, const OtherDerived>
3292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    binaryExpr(const OtherDerived& other, const CustomBinaryOp& func) const {
3302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorCwiseBinaryOp<CustomBinaryOp, const Derived, const OtherDerived>(derived(), other, func);
3312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
3322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Coefficient-wise binary operators.
3342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
3352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseBinaryOp<internal::scalar_sum_op<Scalar>, const Derived, const OtherDerived>
3362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator+(const OtherDerived& other) const {
3372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return binaryExpr(other.derived(), internal::scalar_sum_op<Scalar>());
3382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
3392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
3412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseBinaryOp<internal::scalar_difference_op<Scalar>, const Derived, const OtherDerived>
3422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator-(const OtherDerived& other) const {
3432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return binaryExpr(other.derived(), internal::scalar_difference_op<Scalar>());
3442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
3452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
3472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseBinaryOp<internal::scalar_product_op<Scalar>, const Derived, const OtherDerived>
3482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator*(const OtherDerived& other) const {
3492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return binaryExpr(other.derived(), internal::scalar_product_op<Scalar>());
3502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
3512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
3532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseBinaryOp<internal::scalar_quotient_op<Scalar>, const Derived, const OtherDerived>
3542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator/(const OtherDerived& other) const {
3552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return binaryExpr(other.derived(), internal::scalar_quotient_op<Scalar>());
3562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
3572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
3592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseBinaryOp<internal::scalar_max_op<Scalar>, const Derived, const OtherDerived>
3602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    cwiseMax(const OtherDerived& other) const {
3612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return binaryExpr(other.derived(), internal::scalar_max_op<Scalar>());
3622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
3632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
3652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseBinaryOp<internal::scalar_min_op<Scalar>, const Derived, const OtherDerived>
3662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    cwiseMin(const OtherDerived& other) const {
3672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return binaryExpr(other.derived(), internal::scalar_min_op<Scalar>());
3682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
3692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
3712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseBinaryOp<internal::scalar_boolean_and_op, const Derived, const OtherDerived>
3722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator&&(const OtherDerived& other) const {
3732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return binaryExpr(other.derived(), internal::scalar_boolean_and_op());
3742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
3752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
3772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseBinaryOp<internal::scalar_boolean_or_op, const Derived, const OtherDerived>
3782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator||(const OtherDerived& other) const {
3792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return binaryExpr(other.derived(), internal::scalar_boolean_or_op());
3802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
3812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
3832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseBinaryOp<internal::scalar_boolean_xor_op, const Derived, const OtherDerived>
3842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator^(const OtherDerived& other) const {
3852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return binaryExpr(other.derived(), internal::scalar_boolean_xor_op());
3862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
3872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Comparisons and tests.
3892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
3902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LT>, const Derived, const OtherDerived>
3912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator<(const OtherDerived& other) const {
3922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return binaryExpr(other.derived(), internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LT>());
3932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
3942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
3952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LE>, const Derived, const OtherDerived>
3962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator<=(const OtherDerived& other) const {
3972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return binaryExpr(other.derived(), internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LE>());
3982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
3992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
4002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GT>, const Derived, const OtherDerived>
4012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator>(const OtherDerived& other) const {
4022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return binaryExpr(other.derived(), internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GT>());
4032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
4042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
4052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GE>, const Derived, const OtherDerived>
4062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator>=(const OtherDerived& other) const {
4072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return binaryExpr(other.derived(), internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GE>());
4082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
4092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
4112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_EQ>, const Derived, const OtherDerived>
4122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator==(const OtherDerived& other) const {
4132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return binaryExpr(other.derived(), internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_EQ>());
4142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
4152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
4172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_NEQ>, const Derived, const OtherDerived>
4182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator!=(const OtherDerived& other) const {
4192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return binaryExpr(other.derived(), internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_NEQ>());
4202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
4212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // comparisons and tests for Scalars
4232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
4242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    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> >
4252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator<(Scalar threshold) const {
4262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return operator<(constant(threshold));
4272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
4282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
4292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    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> >
4302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator<=(Scalar threshold) const {
4312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return operator<=(constant(threshold));
4322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
4332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
4342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    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> >
4352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator>(Scalar threshold) const {
4362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return operator>(constant(threshold));
4372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
4382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
4392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    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> >
4402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator>=(Scalar threshold) const {
4412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return operator>=(constant(threshold));
4422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
4432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
4442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    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> >
4452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator==(Scalar threshold) const {
4462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return operator==(constant(threshold));
4472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
4482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
4492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    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> >
4502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator!=(Scalar threshold) const {
4512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return operator!=(constant(threshold));
4522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
4532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Checks
4552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
4562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_isnan_op<Scalar>, const Derived>
4572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    (isnan)() const {
4582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_isnan_op<Scalar>());
4592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
4602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
4612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_isinf_op<Scalar>, const Derived>
4622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    (isinf)() const {
4632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_isinf_op<Scalar>());
4642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
4652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
4662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_isfinite_op<Scalar>, const Derived>
4672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    (isfinite)() const {
4682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return unaryExpr(internal::scalar_isfinite_op<Scalar>());
4692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
4702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Coefficient-wise ternary operators.
4722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename ThenDerived, typename ElseDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
4732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorSelectOp<const Derived, const ThenDerived, const ElseDerived>
4742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    select(const ThenDerived& thenTensor, const ElseDerived& elseTensor) const {
4752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorSelectOp<const Derived, const ThenDerived, const ElseDerived>(derived(), thenTensor.derived(), elseTensor.derived());
4762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
4772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Contractions.
4792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef Eigen::IndexPair<Index> DimensionPair;
4802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived, typename Dimensions> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
4822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorContractionOp<const Dimensions, const Derived, const OtherDerived>
4832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    contract(const OtherDerived& other, const Dimensions& dims) const {
4842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorContractionOp<const Dimensions, const Derived, const OtherDerived>(derived(), other.derived(), dims);
4852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
4862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Convolutions.
4882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename KernelDerived, typename Dimensions> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
4892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorConvolutionOp<const Dimensions, const Derived, const KernelDerived>
4902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    convolve(const KernelDerived& kernel, const Dimensions& dims) const {
4912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorConvolutionOp<const Dimensions, const Derived, const KernelDerived>(derived(), kernel.derived(), dims);
4922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
4932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Fourier transforms
4952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <int FFTDataType, int FFTDirection, typename FFT> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
4962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorFFTOp<const FFT, const Derived, FFTDataType, FFTDirection>
4972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    fft(const FFT& fft) const {
4982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorFFTOp<const FFT, const Derived, FFTDataType, FFTDirection>(derived(), fft);
4992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
5002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Scan.
5022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef TensorScanOp<internal::SumReducer<CoeffReturnType>, const Derived> TensorScanSumOp;
5032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
5042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorScanSumOp
5052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    cumsum(const Index& axis, bool exclusive = false) const {
5062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorScanSumOp(derived(), axis, exclusive);
5072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
5082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef TensorScanOp<internal::ProdReducer<CoeffReturnType>, const Derived> TensorScanProdOp;
5102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
5112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorScanProdOp
5122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    cumprod(const Index& axis, bool exclusive = false) const {
5132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorScanProdOp(derived(), axis, exclusive);
5142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
5152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Reducer>
5172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
5182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorScanOp<Reducer, const Derived>
5192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    scan(const Index& axis, const Reducer& reducer, bool exclusive = false) const {
5202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorScanOp<Reducer, const Derived>(derived(), axis, exclusive, reducer);
5212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
5222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Reductions.
5242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Dims> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
5252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorReductionOp<internal::SumReducer<CoeffReturnType>, const Dims, const Derived>
5262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    sum(const Dims& dims) const {
5272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorReductionOp<internal::SumReducer<CoeffReturnType>, const Dims, const Derived>(derived(), dims, internal::SumReducer<CoeffReturnType>());
5282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
5292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorReductionOp<internal::SumReducer<CoeffReturnType>, const DimensionList<Index, NumDimensions>, const Derived>
5312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    sum() const {
5322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      DimensionList<Index, NumDimensions> in_dims;
5332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorReductionOp<internal::SumReducer<CoeffReturnType>, const DimensionList<Index, NumDimensions>, const Derived>(derived(), in_dims, internal::SumReducer<CoeffReturnType>());
5342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
5352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Dims> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
5372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorReductionOp<internal::MeanReducer<CoeffReturnType>, const Dims, const Derived>
5382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mean(const Dims& dims) const {
5392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorReductionOp<internal::MeanReducer<CoeffReturnType>, const Dims, const Derived>(derived(), dims, internal::MeanReducer<CoeffReturnType>());
5402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
5412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorReductionOp<internal::MeanReducer<CoeffReturnType>, const DimensionList<Index, NumDimensions>, const Derived>
5432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    mean() const {
5442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      DimensionList<Index, NumDimensions> in_dims;
5452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorReductionOp<internal::MeanReducer<CoeffReturnType>, const DimensionList<Index, NumDimensions>, const Derived>(derived(), in_dims, internal::MeanReducer<CoeffReturnType>());
5462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
5472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Dims> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
5492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorReductionOp<internal::ProdReducer<CoeffReturnType>, const Dims, const Derived>
5502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    prod(const Dims& dims) const {
5512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorReductionOp<internal::ProdReducer<CoeffReturnType>, const Dims, const Derived>(derived(), dims, internal::ProdReducer<CoeffReturnType>());
5522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
5532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorReductionOp<internal::ProdReducer<CoeffReturnType>, const DimensionList<Index, NumDimensions>, const Derived>
5552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    prod() const {
5562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      DimensionList<Index, NumDimensions> in_dims;
5572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorReductionOp<internal::ProdReducer<CoeffReturnType>, const DimensionList<Index, NumDimensions>, const Derived>(derived(), in_dims, internal::ProdReducer<CoeffReturnType>());
5582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
5592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Dims> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
5612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorReductionOp<internal::MaxReducer<CoeffReturnType>, const Dims, const Derived>
5622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    maximum(const Dims& dims) const {
5632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorReductionOp<internal::MaxReducer<CoeffReturnType>, const Dims, const Derived>(derived(), dims, internal::MaxReducer<CoeffReturnType>());
5642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
5652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorReductionOp<internal::MaxReducer<CoeffReturnType>, const DimensionList<Index, NumDimensions>, const Derived>
5672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    maximum() const {
5682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      DimensionList<Index, NumDimensions> in_dims;
5692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorReductionOp<internal::MaxReducer<CoeffReturnType>, const DimensionList<Index, NumDimensions>, const Derived>(derived(), in_dims, internal::MaxReducer<CoeffReturnType>());
5702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
5712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Dims> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
5732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorReductionOp<internal::MinReducer<CoeffReturnType>, const Dims, const Derived>
5742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    minimum(const Dims& dims) const {
5752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorReductionOp<internal::MinReducer<CoeffReturnType>, const Dims, const Derived>(derived(), dims, internal::MinReducer<CoeffReturnType>());
5762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
5772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorReductionOp<internal::MinReducer<CoeffReturnType>, const DimensionList<Index, NumDimensions>, const Derived>
5792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    minimum() const {
5802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      DimensionList<Index, NumDimensions> in_dims;
5812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorReductionOp<internal::MinReducer<CoeffReturnType>, const DimensionList<Index, NumDimensions>, const Derived>(derived(), in_dims, internal::MinReducer<CoeffReturnType>());
5822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
5832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Dims> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
5852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorReductionOp<internal::AndReducer, const Dims, const TensorConversionOp<bool, const Derived> >
5862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    all(const Dims& dims) const {
5872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return cast<bool>().reduce(dims, internal::AndReducer());
5882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
5892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
5912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorReductionOp<internal::AndReducer, const DimensionList<Index, NumDimensions>, const TensorConversionOp<bool, const Derived> >
5922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    all() const {
5932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      DimensionList<Index, NumDimensions> in_dims;
5942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return cast<bool>().reduce(in_dims, internal::AndReducer());
5952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
5962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Dims> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
5982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorReductionOp<internal::OrReducer, const Dims, const TensorConversionOp<bool, const Derived> >
5992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    any(const Dims& dims) const {
6002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return cast<bool>().reduce(dims, internal::OrReducer());
6012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
6022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
6042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorReductionOp<internal::OrReducer, const DimensionList<Index, NumDimensions>, const TensorConversionOp<bool, const Derived> >
6052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    any() const {
6062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      DimensionList<Index, NumDimensions> in_dims;
6072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return cast<bool>().reduce(in_dims, internal::OrReducer());
6082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
6092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
6112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorTupleReducerOp<
6122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      internal::ArgMaxTupleReducer<Tuple<Index, CoeffReturnType> >,
6132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      const array<Index, NumDimensions>, const Derived>
6142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    argmax() const {
6152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      array<Index, NumDimensions> in_dims;
6162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      for (int d = 0; d < NumDimensions; ++d) in_dims[d] = d;
6172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorTupleReducerOp<
6182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        internal::ArgMaxTupleReducer<Tuple<Index, CoeffReturnType> >,
6192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        const array<Index, NumDimensions>,
6202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        const Derived>(derived(), internal::ArgMaxTupleReducer<Tuple<Index, CoeffReturnType> >(), -1, in_dims);
6212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
6222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
6242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorTupleReducerOp<
6252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      internal::ArgMinTupleReducer<Tuple<Index, CoeffReturnType> >,
6262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      const array<Index, NumDimensions>, const Derived>
6272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    argmin() const {
6282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      array<Index, NumDimensions> in_dims;
6292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      for (int d = 0; d < NumDimensions; ++d) in_dims[d] = d;
6302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorTupleReducerOp<
6312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        internal::ArgMinTupleReducer<Tuple<Index, CoeffReturnType> >,
6322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        const array<Index, NumDimensions>,
6332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        const Derived>(derived(), internal::ArgMinTupleReducer<Tuple<Index, CoeffReturnType> >(), -1, in_dims);
6342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
6352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
6372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorTupleReducerOp<
6382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      internal::ArgMaxTupleReducer<Tuple<Index, CoeffReturnType> >,
6392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      const array<Index, 1>, const Derived>
6402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    argmax(const int return_dim) const {
6412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      array<Index, 1> in_dims;
6422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      in_dims[0] = return_dim;
6432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorTupleReducerOp<
6442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        internal::ArgMaxTupleReducer<Tuple<Index, CoeffReturnType> >,
6452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        const array<Index, 1>,
6462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        const Derived>(derived(), internal::ArgMaxTupleReducer<Tuple<Index, CoeffReturnType> >(), return_dim, in_dims);
6472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
6482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
6502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorTupleReducerOp<
6512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      internal::ArgMinTupleReducer<Tuple<Index, CoeffReturnType> >,
6522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      const array<Index, 1>, const Derived>
6532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    argmin(const int return_dim) const {
6542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      array<Index, 1> in_dims;
6552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      in_dims[0] = return_dim;
6562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorTupleReducerOp<
6572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        internal::ArgMinTupleReducer<Tuple<Index, CoeffReturnType> >,
6582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        const array<Index, 1>,
6592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        const Derived>(derived(), internal::ArgMinTupleReducer<Tuple<Index, CoeffReturnType> >(), return_dim, in_dims);
6602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
6612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Reducer, typename Dims> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
6632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorReductionOp<Reducer, const Dims, const Derived>
6642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    reduce(const Dims& dims, const Reducer& reducer) const {
6652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorReductionOp<Reducer, const Dims, const Derived>(derived(), dims, reducer);
6662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
6672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Broadcast> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
6692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorBroadcastingOp<const Broadcast, const Derived>
6702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    broadcast(const Broadcast& broadcast) const {
6712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorBroadcastingOp<const Broadcast, const Derived>(derived(), broadcast);
6722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
6732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Axis, typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
6752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorConcatenationOp<Axis, const Derived, const OtherDerived>
6762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    concatenate(const OtherDerived& other, Axis axis) const {
6772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorConcatenationOp<Axis, const Derived, const OtherDerived>(derived(), other.derived(), axis);
6782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
6792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename PatchDims> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
6812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorPatchOp<const PatchDims, const Derived>
6822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    extract_patches(const PatchDims& patch_dims) const {
6832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorPatchOp<const PatchDims, const Derived>(derived(), patch_dims);
6842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
6852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
6872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorImagePatchOp<Dynamic, Dynamic, const Derived>
6882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    extract_image_patches(const Index patch_rows = 1, const Index patch_cols = 1,
6892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                          const Index row_stride = 1, const Index col_stride = 1,
6902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                          const Index in_row_stride = 1, const Index in_col_stride = 1,
6912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                          const PaddingType padding_type = PADDING_SAME, const Scalar padding_value = Scalar(0)) const {
6922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorImagePatchOp<Dynamic, Dynamic, const Derived>(derived(), patch_rows, patch_cols, row_stride, col_stride,
6932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                                                 in_row_stride, in_col_stride, 1, 1, padding_type, padding_value);
6942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
6952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
6972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorImagePatchOp<Dynamic, Dynamic, const Derived>
6982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    extract_image_patches(const Index patch_rows, const Index patch_cols,
6992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                          const Index row_stride, const Index col_stride,
7002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                          const Index in_row_stride, const Index in_col_stride,
7012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                          const Index row_inflate_stride, const Index col_inflate_stride,
7022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                          const Index padding_top, const Index padding_bottom,
7032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                          const Index padding_left,const Index padding_right,
7042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                          const Scalar padding_value) const {
7052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorImagePatchOp<Dynamic, Dynamic, const Derived>(derived(), patch_rows, patch_cols, row_stride, col_stride,
7062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                                                 in_row_stride, in_col_stride, row_inflate_stride, col_inflate_stride,
7072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                                                 padding_top, padding_bottom, padding_left, padding_right, padding_value);
7082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
7092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
7112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorVolumePatchOp<Dynamic, Dynamic, Dynamic, const Derived>
7122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    extract_volume_patches(const Index patch_planes, const Index patch_rows, const Index patch_cols,
7132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                           const Index plane_stride = 1, const Index row_stride = 1, const Index col_stride = 1,
7142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                           const PaddingType padding_type = PADDING_SAME, const Scalar padding_value = Scalar(0)) const {
7152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      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);
7162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
7172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
7202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorVolumePatchOp<Dynamic, Dynamic, Dynamic, const Derived>
7212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    extract_volume_patches(const Index patch_planes, const Index patch_rows, const Index patch_cols,
7222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                           const Index plane_stride, const Index row_stride, const Index col_stride,
7232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                           const Index plane_inflate_stride, const Index row_inflate_stride, const Index col_inflate_stride,
7242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                           const Index padding_top_z, const Index padding_bottom_z,
7252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                           const Index padding_top, const Index padding_bottom,
7262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                           const Index padding_left, const Index padding_right, const Scalar padding_value = Scalar(0)) const {
7272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      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);
7282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
7292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Morphing operators.
7312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
7322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorLayoutSwapOp<const Derived>
7332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    swap_layout() const {
7342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorLayoutSwapOp<const Derived>(derived());
7352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
7362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename NewDimensions> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
7372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorReshapingOp<const NewDimensions, const Derived>
7382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    reshape(const NewDimensions& newDimensions) const {
7392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorReshapingOp<const NewDimensions, const Derived>(derived(), newDimensions);
7402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
7412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename StartIndices, typename Sizes> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
7422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorSlicingOp<const StartIndices, const Sizes, const Derived>
7432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    slice(const StartIndices& startIndices, const Sizes& sizes) const {
7442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorSlicingOp<const StartIndices, const Sizes, const Derived>(derived(), startIndices, sizes);
7452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
7462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename StartIndices, typename StopIndices, typename Strides> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
7472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorStridingSlicingOp<const StartIndices, const StopIndices, const Strides, const Derived>
7482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    stridedSlice(const StartIndices& startIndices, const StopIndices& stopIndices, const Strides& strides) const {
7492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorStridingSlicingOp<const StartIndices, const StopIndices, const Strides,
7502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                const Derived>(derived(), startIndices, stopIndices, strides);
7512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
7522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <Index DimId> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
7532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorChippingOp<DimId, const Derived>
7542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    chip(const Index offset) const {
7552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorChippingOp<DimId, const Derived>(derived(), offset, DimId);
7562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
7572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
7582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorChippingOp<Dynamic, const Derived>
7592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    chip(const Index offset, const Index dim) const {
7602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorChippingOp<Dynamic, const Derived>(derived(), offset, dim);
7612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
7622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename ReverseDimensions> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
7632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorReverseOp<const ReverseDimensions, const Derived>
7642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    reverse(const ReverseDimensions& rev) const {
7652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorReverseOp<const ReverseDimensions, const Derived>(derived(), rev);
7662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
7672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename PaddingDimensions> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
7682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorPaddingOp<const PaddingDimensions, const Derived>
7692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    pad(const PaddingDimensions& padding) const {
7702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorPaddingOp<const PaddingDimensions, const Derived>(derived(), padding, internal::scalar_cast_op<int, Scalar>()(0));
7712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
7722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename PaddingDimensions> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
7732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorPaddingOp<const PaddingDimensions, const Derived>
7742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    pad(const PaddingDimensions& padding, const Scalar padding_value) const {
7752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorPaddingOp<const PaddingDimensions, const Derived>(derived(), padding, padding_value);
7762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
7772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Shuffle> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
7782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorShufflingOp<const Shuffle, const Derived>
7792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    shuffle(const Shuffle& shuffle) const {
7802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorShufflingOp<const Shuffle, const Derived>(derived(), shuffle);
7812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
7822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Strides> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
7832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorStridingOp<const Strides, const Derived>
7842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    stride(const Strides& strides) const {
7852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorStridingOp<const Strides, const Derived>(derived(), strides);
7862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
7872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Strides> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
7882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorInflationOp<const Strides, const Derived>
7892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inflate(const Strides& strides) const {
7902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorInflationOp<const Strides, const Derived>(derived(), strides);
7912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
7922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Returns a tensor containing index/value tuples
7942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
7952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorIndexTupleOp<const Derived>
7962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    index_tuples() const {
7972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorIndexTupleOp<const Derived>(derived());
7982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
7992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Support for custom unary and binary operations
8012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename CustomUnaryFunc>
8022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
8032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCustomUnaryOp<const CustomUnaryFunc, const Derived> customOp(const CustomUnaryFunc& op) const {
8042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorCustomUnaryOp<const CustomUnaryFunc, const Derived>(derived(), op);
8052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
8062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename OtherDerived, typename CustomBinaryFunc>
8072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
8082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorCustomBinaryOp<const CustomBinaryFunc, const Derived, const OtherDerived> customOp(const OtherDerived& other, const CustomBinaryFunc& op) const {
8092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorCustomBinaryOp<const CustomBinaryFunc, const Derived, const OtherDerived>(derived(), other, op);
8102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
8112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Force the evaluation of the expression.
8132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
8142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorForcedEvalOp<const Derived> eval() const {
8152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorForcedEvalOp<const Derived>(derived());
8162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
8172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  protected:
8192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Scalar, int NumIndices, int Options, typename IndexType> friend class Tensor;
8202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Scalar, typename Dimensions, int Option, typename IndexTypes> friend class TensorFixedSize;
8212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename OtherDerived, int AccessLevel> friend class TensorBase;
8222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
8232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const Derived& derived() const { return *static_cast<const Derived*>(this); }
8242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
8252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Derived, int AccessLevel = internal::accessors_level<Derived>::value>
8272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangclass TensorBase : public TensorBase<Derived, ReadOnlyAccessors> {
8282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang public:
8292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef internal::traits<Derived> DerivedTraits;
8302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename DerivedTraits::Scalar Scalar;
8312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename DerivedTraits::Index Index;
8322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef Scalar CoeffReturnType;
8332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    static const int NumDimensions = DerivedTraits::NumDimensions;
8342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Scalar, int NumIndices, int Options, typename IndexType> friend class Tensor;
8362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Scalar, typename Dimensions, int Option, typename IndexTypes> friend class TensorFixedSize;
8372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename OtherDerived, int OtherAccessLevel> friend class TensorBase;
8382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
8402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE Derived& setZero() {
8412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return setConstant(Scalar(0));
8422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
8432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
8442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE Derived& setConstant(const Scalar& val) {
8452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return derived() = this->constant(val);
8462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
8472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
8482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE Derived& setRandom() {
8492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return derived() = this->random();
8502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
8512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename RandomGenerator> EIGEN_DEVICE_FUNC
8522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE Derived& setRandom() {
8532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return derived() = this->template random<RandomGenerator>();
8542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
8552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#if EIGEN_HAS_VARIADIC_TEMPLATES
8572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
8582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE Derived& setValues(
8592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        const typename internal::Initializer<Derived, NumDimensions>::InitList& vals) {
8602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      TensorEvaluator<Derived, DefaultDevice> eval(derived(), DefaultDevice());
8612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      internal::initialize_tensor<Derived, NumDimensions>(eval, vals);
8622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return derived();
8632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
8642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#endif  // EIGEN_HAS_VARIADIC_TEMPLATES
8652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
8672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Derived& operator+=(const OtherDerived& other) {
8682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return derived() = derived() + other.derived();
8692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
8702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
8712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Derived& operator-=(const OtherDerived& other) {
8722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return derived() = derived() - other.derived();
8732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
8742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
8752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Derived& operator*=(const OtherDerived& other) {
8762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return derived() = derived() * other.derived();
8772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
8782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
8792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Derived& operator/=(const OtherDerived& other) {
8802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return derived() = derived() / other.derived();
8812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
8822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
8842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorLayoutSwapOp<const Derived>
8852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    swap_layout() const {
8862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorLayoutSwapOp<const Derived>(derived());
8872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
8882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
8892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    TensorLayoutSwapOp<Derived>
8902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    swap_layout() {
8912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorLayoutSwapOp<Derived>(derived());
8922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
8932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Axis, typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
8952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorConcatenationOp<const Axis, const Derived, const OtherDerived>
8962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    concatenate(const OtherDerived& other, const Axis& axis) const {
8972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorConcatenationOp<const Axis, const Derived, const OtherDerived>(derived(), other, axis);
8982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
8992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Axis, typename OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
9002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    TensorConcatenationOp<const Axis, Derived, OtherDerived>
9012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    concatenate(const OtherDerived& other, const Axis& axis) {
9022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorConcatenationOp<const Axis, Derived, OtherDerived>(derived(), other, axis);
9032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
9042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename NewDimensions> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
9062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorReshapingOp<const NewDimensions, const Derived>
9072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    reshape(const NewDimensions& newDimensions) const {
9082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorReshapingOp<const NewDimensions, const Derived>(derived(), newDimensions);
9092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
9102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename NewDimensions> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
9112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    TensorReshapingOp<const NewDimensions, Derived>
9122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    reshape(const NewDimensions& newDimensions) {
9132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorReshapingOp<const NewDimensions, Derived>(derived(), newDimensions);
9142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
9152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename StartIndices, typename Sizes> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
9172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorSlicingOp<const StartIndices, const Sizes, const Derived>
9182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    slice(const StartIndices& startIndices, const Sizes& sizes) const {
9192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorSlicingOp<const StartIndices, const Sizes, const Derived>(derived(), startIndices, sizes);
9202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
9212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename StartIndices, typename Sizes> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
9222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    TensorSlicingOp<const StartIndices, const Sizes, Derived>
9232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    slice(const StartIndices& startIndices, const Sizes& sizes) {
9242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorSlicingOp<const StartIndices, const Sizes, Derived>(derived(), startIndices, sizes);
9252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
9262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename StartIndices, typename StopIndices, typename Strides> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
9282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorStridingSlicingOp<const StartIndices, const StopIndices, const Strides, const Derived>
9292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    stridedSlice(const StartIndices& startIndices, const StopIndices& stopIndices, const Strides& strides) const {
9302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorStridingSlicingOp<const StartIndices, const StopIndices, const Strides,
9312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                const Derived>(derived(), startIndices, stopIndices, strides);
9322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
9332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename StartIndices, typename StopIndices, typename Strides> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
9342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    TensorStridingSlicingOp<const StartIndices, const StopIndices, const Strides, Derived>
9352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    stridedSlice(const StartIndices& startIndices, const StopIndices& stopIndices, const Strides& strides) {
9362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorStridingSlicingOp<const StartIndices, const StopIndices, const Strides,
9372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                Derived>(derived(), startIndices, stopIndices, strides);
9382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
9392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <DenseIndex DimId> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
9412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorChippingOp<DimId, const Derived>
9422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    chip(const Index offset) const {
9432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorChippingOp<DimId, const Derived>(derived(), offset, DimId);
9442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
9452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <Index DimId> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
9462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    TensorChippingOp<DimId, Derived>
9472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    chip(const Index offset) {
9482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorChippingOp<DimId, Derived>(derived(), offset, DimId);
9492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
9502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
9522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorChippingOp<Dynamic, const Derived>
9532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    chip(const Index offset, const Index dim) const {
9542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorChippingOp<Dynamic, const Derived>(derived(), offset, dim);
9552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
9562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
9572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    TensorChippingOp<Dynamic, Derived>
9582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    chip(const Index offset, const Index dim) {
9592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorChippingOp<Dynamic, Derived>(derived(), offset, dim);
9602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
9612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename ReverseDimensions> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
9632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorReverseOp<const ReverseDimensions, const Derived>
9642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    reverse(const ReverseDimensions& rev) const {
9652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorReverseOp<const ReverseDimensions, const Derived>(derived(), rev);
9662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
9672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename ReverseDimensions> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
9682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    TensorReverseOp<const ReverseDimensions, Derived>
9692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    reverse(const ReverseDimensions& rev) {
9702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorReverseOp<const ReverseDimensions, Derived>(derived(), rev);
9712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
9722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Shuffle> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
9742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorShufflingOp<const Shuffle, const Derived>
9752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    shuffle(const Shuffle& shuffle) const {
9762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorShufflingOp<const Shuffle, const Derived>(derived(), shuffle);
9772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
9782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Shuffle> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
9792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    TensorShufflingOp<const Shuffle, Derived>
9802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    shuffle(const Shuffle& shuffle) {
9812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorShufflingOp<const Shuffle, Derived>(derived(), shuffle);
9822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
9832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Strides> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
9852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const TensorStridingOp<const Strides, const Derived>
9862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    stride(const Strides& strides) const {
9872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorStridingOp<const Strides, const Derived>(derived(), strides);
9882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
9892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename Strides> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
9902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    TensorStridingOp<const Strides, Derived>
9912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    stride(const Strides& strides) {
9922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorStridingOp<const Strides, Derived>(derived(), strides);
9932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
9942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Select the device on which to evaluate the expression.
9962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template <typename DeviceType>
9972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    TensorDevice<Derived, DeviceType> device(const DeviceType& device) {
9982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return TensorDevice<Derived, DeviceType>(device, derived());
9992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
10002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
10012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang protected:
10022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
10032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE Derived& derived() { return *static_cast<Derived*>(this); }
10042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
10052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const Derived& derived() const { return *static_cast<const Derived*>(this); }
10062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
10072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
10082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} // end namespace Eigen
10092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
10102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#endif // EIGEN_CXX11_TENSOR_TENSOR_BASE_H
1011