10#ifndef EIGEN_CXX11_TENSOR_TENSOR_EXPR_H
11#define EIGEN_CXX11_TENSOR_TENSOR_EXPR_H
14#include "./InternalHeaderCheck.h"
19template <
typename NullaryOp,
typename XprType>
20struct traits<TensorCwiseNullaryOp<NullaryOp, XprType> > : traits<XprType> {
21 typedef traits<XprType> XprTraits;
22 typedef typename XprType::Scalar Scalar;
23 typedef typename XprType::Nested XprTypeNested;
24 typedef std::remove_reference_t<XprTypeNested> XprTypeNested_;
25 static constexpr int NumDimensions = XprTraits::NumDimensions;
26 static constexpr int Layout = XprTraits::Layout;
27 typedef typename XprTraits::PointerType PointerType;
41template <
typename NullaryOp,
typename XprType>
42class TensorCwiseNullaryOp :
public TensorBase<TensorCwiseNullaryOp<NullaryOp, XprType>, ReadOnlyAccessors> {
44 typedef typename Eigen::internal::traits<TensorCwiseNullaryOp>::Scalar Scalar;
46 typedef typename XprType::CoeffReturnType CoeffReturnType;
47 typedef TensorCwiseNullaryOp<NullaryOp, XprType> Nested;
48 typedef typename Eigen::internal::traits<TensorCwiseNullaryOp>::StorageKind StorageKind;
49 typedef typename Eigen::internal::traits<TensorCwiseNullaryOp>::Index Index;
51 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseNullaryOp(
const XprType& xpr,
const NullaryOp& func = NullaryOp())
52 : m_xpr(xpr), m_functor(func) {}
54 EIGEN_DEVICE_FUNC
const internal::remove_all_t<typename XprType::Nested>& nestedExpression()
const {
return m_xpr; }
56 EIGEN_DEVICE_FUNC
const NullaryOp& functor()
const {
return m_functor; }
59 typename XprType::Nested m_xpr;
60 const NullaryOp m_functor;
64template <
typename UnaryOp,
typename XprType>
68 typedef typename result_of<UnaryOp(
typename XprType::Scalar)>::type
Scalar;
69 typedef traits<XprType> XprTraits;
70 typedef typename XprType::Nested XprTypeNested;
71 typedef std::remove_reference_t<XprTypeNested> XprTypeNested_;
72 static constexpr int NumDimensions = XprTraits::NumDimensions;
73 static constexpr int Layout = XprTraits::Layout;
74 typedef typename TypeConversion<Scalar, typename XprTraits::PointerType>::type PointerType;
77template <
typename UnaryOp,
typename XprType>
78struct eval<TensorCwiseUnaryOp<UnaryOp, XprType>,
Eigen::Dense> {
79 typedef const TensorCwiseUnaryOp<UnaryOp, XprType>& type;
82template <
typename UnaryOp,
typename XprType>
83struct nested<TensorCwiseUnaryOp<UnaryOp, XprType>, 1, typename eval<TensorCwiseUnaryOp<UnaryOp, XprType> >::type> {
84 typedef TensorCwiseUnaryOp<UnaryOp, XprType> type;
97template <
typename UnaryOp,
typename XprType>
98class TensorCwiseUnaryOp :
public TensorBase<TensorCwiseUnaryOp<UnaryOp, XprType>, ReadOnlyAccessors> {
102 typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::Scalar Scalar;
104 typedef Scalar CoeffReturnType;
105 typedef typename Eigen::internal::nested<TensorCwiseUnaryOp>::type Nested;
106 typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::StorageKind StorageKind;
107 typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::Index Index;
109 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseUnaryOp(
const XprType& xpr,
const UnaryOp& func = UnaryOp())
110 : m_xpr(xpr), m_functor(func) {}
112 EIGEN_DEVICE_FUNC
const UnaryOp& functor()
const {
return m_functor; }
115 EIGEN_DEVICE_FUNC
const internal::remove_all_t<typename XprType::Nested>&
nestedExpression()
const {
return m_xpr; }
118 typename XprType::Nested m_xpr;
119 const UnaryOp m_functor;
123template <
typename BinaryOp,
typename LhsXprType,
typename RhsXprType>
124struct traits<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> > {
129 typedef typename result_of<BinaryOp(
typename LhsXprType::Scalar,
typename RhsXprType::Scalar)>::type Scalar;
130 typedef traits<LhsXprType> XprTraits;
131 typedef typename promote_storage_type<typename traits<LhsXprType>::StorageKind,
132 typename traits<RhsXprType>::StorageKind>::ret StorageKind;
134 typename promote_index_type<typename traits<LhsXprType>::Index,
typename traits<RhsXprType>::Index>::type Index;
135 typedef typename LhsXprType::Nested LhsNested;
136 typedef typename RhsXprType::Nested RhsNested;
137 typedef std::remove_reference_t<LhsNested> LhsNested_;
138 typedef std::remove_reference_t<RhsNested> RhsNested_;
139 static constexpr int NumDimensions = XprTraits::NumDimensions;
140 static constexpr int Layout = XprTraits::Layout;
141 typedef typename TypeConversion<Scalar,
142 std::conditional_t<Pointer_type_promotion<typename LhsXprType::Scalar, Scalar>::val,
143 typename traits<LhsXprType>::PointerType,
144 typename traits<RhsXprType>::PointerType> >::type PointerType;
148template <
typename BinaryOp,
typename LhsXprType,
typename RhsXprType>
149struct eval<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>, Eigen::Dense> {
150 typedef const TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>& type;
153template <
typename BinaryOp,
typename LhsXprType,
typename RhsXprType>
154struct nested<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>, 1,
155 typename eval<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> >::type> {
156 typedef TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> type;
169template <
typename BinaryOp,
typename LhsXprType,
typename RhsXprType>
170class TensorCwiseBinaryOp
171 :
public TensorBase<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>, ReadOnlyAccessors> {
175 typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::Scalar Scalar;
177 typedef Scalar CoeffReturnType;
178 typedef typename Eigen::internal::nested<TensorCwiseBinaryOp>::type Nested;
179 typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::StorageKind StorageKind;
180 typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::Index Index;
182 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseBinaryOp(
const LhsXprType& lhs,
const RhsXprType& rhs,
183 const BinaryOp& func = BinaryOp())
184 : m_lhs_xpr(lhs), m_rhs_xpr(rhs), m_functor(func) {}
186 EIGEN_DEVICE_FUNC
const BinaryOp& functor()
const {
return m_functor; }
189 EIGEN_DEVICE_FUNC
const internal::remove_all_t<typename LhsXprType::Nested>&
lhsExpression()
const {
193 EIGEN_DEVICE_FUNC
const internal::remove_all_t<typename RhsXprType::Nested>& rhsExpression()
const {
198 typename LhsXprType::Nested m_lhs_xpr;
199 typename RhsXprType::Nested m_rhs_xpr;
200 const BinaryOp m_functor;
204template <
typename TernaryOp,
typename Arg1XprType,
typename Arg2XprType,
typename Arg3XprType>
205struct traits<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> > {
207 typedef typename result_of<TernaryOp(
typename Arg1XprType::Scalar,
typename Arg2XprType::Scalar,
208 typename Arg3XprType::Scalar)>::type Scalar;
209 typedef traits<Arg1XprType> XprTraits;
210 typedef typename traits<Arg1XprType>::StorageKind StorageKind;
211 typedef typename traits<Arg1XprType>::Index
Index;
212 typedef typename Arg1XprType::Nested Arg1Nested;
213 typedef typename Arg2XprType::Nested Arg2Nested;
214 typedef typename Arg3XprType::Nested Arg3Nested;
215 typedef std::remove_reference_t<Arg1Nested> Arg1Nested_;
216 typedef std::remove_reference_t<Arg2Nested> Arg2Nested_;
217 typedef std::remove_reference_t<Arg3Nested> Arg3Nested_;
218 static constexpr int NumDimensions = XprTraits::NumDimensions;
219 static constexpr int Layout = XprTraits::Layout;
220 typedef typename TypeConversion<Scalar,
221 std::conditional_t<Pointer_type_promotion<typename Arg2XprType::Scalar, Scalar>::val,
222 typename traits<Arg2XprType>::PointerType,
223 typename traits<Arg3XprType>::PointerType> >::type PointerType;
227template <
typename TernaryOp,
typename Arg1XprType,
typename Arg2XprType,
typename Arg3XprType>
228struct eval<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>, Eigen::Dense> {
229 typedef const TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>& type;
232template <
typename TernaryOp,
typename Arg1XprType,
typename Arg2XprType,
typename Arg3XprType>
233struct nested<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>, 1,
234 typename eval<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> >::type> {
235 typedef TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> type;
240template <
typename TernaryOp,
typename Arg1XprType,
typename Arg2XprType,
typename Arg3XprType>
241class TensorCwiseTernaryOp
242 :
public TensorBase<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>, ReadOnlyAccessors> {
244 typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::Scalar Scalar;
245 typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
246 typedef Scalar CoeffReturnType;
247 typedef typename Eigen::internal::nested<TensorCwiseTernaryOp>::type Nested;
248 typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::StorageKind StorageKind;
249 typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::Index Index;
251 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseTernaryOp(
const Arg1XprType& arg1,
const Arg2XprType& arg2,
252 const Arg3XprType& arg3,
253 const TernaryOp& func = TernaryOp())
254 : m_arg1_xpr(arg1), m_arg2_xpr(arg2), m_arg3_xpr(arg3), m_functor(func) {}
256 EIGEN_DEVICE_FUNC
const TernaryOp& functor()
const {
return m_functor; }
259 EIGEN_DEVICE_FUNC
const internal::remove_all_t<typename Arg1XprType::Nested>& arg1Expression()
const {
263 EIGEN_DEVICE_FUNC
const internal::remove_all_t<typename Arg2XprType::Nested>& arg2Expression()
const {
267 EIGEN_DEVICE_FUNC
const internal::remove_all_t<typename Arg3XprType::Nested>& arg3Expression()
const {
272 typename Arg1XprType::Nested m_arg1_xpr;
273 typename Arg2XprType::Nested m_arg2_xpr;
274 typename Arg3XprType::Nested m_arg3_xpr;
275 const TernaryOp m_functor;
279template <
typename IfXprType,
typename ThenXprType,
typename ElseXprType>
280struct traits<TensorSelectOp<IfXprType, ThenXprType, ElseXprType> > : traits<ThenXprType> {
281 typedef typename traits<ThenXprType>::Scalar Scalar;
282 typedef traits<ThenXprType> XprTraits;
283 typedef typename promote_storage_type<typename traits<ThenXprType>::StorageKind,
284 typename traits<ElseXprType>::StorageKind>::ret StorageKind;
286 typename promote_index_type<typename traits<ElseXprType>::Index,
typename traits<ThenXprType>::Index>::type
Index;
287 typedef typename IfXprType::Nested IfNested;
288 typedef typename ThenXprType::Nested ThenNested;
289 typedef typename ElseXprType::Nested ElseNested;
290 static constexpr int NumDimensions = XprTraits::NumDimensions;
291 static constexpr int Layout = XprTraits::Layout;
292 typedef std::conditional_t<Pointer_type_promotion<typename ThenXprType::Scalar, Scalar>::val,
293 typename traits<ThenXprType>::PointerType,
typename traits<ElseXprType>::PointerType>
297template <
typename IfXprType,
typename ThenXprType,
typename ElseXprType>
298struct eval<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>, Eigen::Dense> {
299 typedef const TensorSelectOp<IfXprType, ThenXprType, ElseXprType>& type;
302template <
typename IfXprType,
typename ThenXprType,
typename ElseXprType>
303struct nested<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>, 1,
304 typename eval<TensorSelectOp<IfXprType, ThenXprType, ElseXprType> >::type> {
305 typedef TensorSelectOp<IfXprType, ThenXprType, ElseXprType> type;
310template <
typename IfXprType,
typename ThenXprType,
typename ElseXprType>
311class TensorSelectOp :
public TensorBase<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>, ReadOnlyAccessors> {
313 typedef typename Eigen::internal::traits<TensorSelectOp>::Scalar Scalar;
314 typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
315 typedef typename internal::promote_storage_type<
typename ThenXprType::CoeffReturnType,
316 typename ElseXprType::CoeffReturnType>::ret CoeffReturnType;
317 typedef typename Eigen::internal::nested<TensorSelectOp>::type Nested;
318 typedef typename Eigen::internal::traits<TensorSelectOp>::StorageKind StorageKind;
319 typedef typename Eigen::internal::traits<TensorSelectOp>::Index Index;
321 EIGEN_DEVICE_FUNC TensorSelectOp(
const IfXprType& a_condition,
const ThenXprType& a_then,
const ElseXprType& a_else)
322 : m_condition(a_condition), m_then(a_then), m_else(a_else) {}
324 EIGEN_DEVICE_FUNC
const IfXprType& ifExpression()
const {
return m_condition; }
326 EIGEN_DEVICE_FUNC
const ThenXprType& thenExpression()
const {
return m_then; }
328 EIGEN_DEVICE_FUNC
const ElseXprType& elseExpression()
const {
return m_else; }
331 typename IfXprType::Nested m_condition;
332 typename ThenXprType::Nested m_then;
333 typename ElseXprType::Nested m_else;
The tensor base class.
Definition TensorForwardDeclarations.h:68
const internal::remove_all_t< typename LhsXprType::Nested > & lhsExpression() const
Definition TensorExpr.h:189
Tensor unary expression.
Definition TensorExpr.h:98
const internal::remove_all_t< typename XprType::Nested > & nestedExpression() const
Definition TensorExpr.h:115
Namespace containing all symbols from the Eigen library.
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index