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